home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 066 < prev    next >
Internet Message Format  |  1997-05-06  |  168KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-066
  3. Date: Mon, 7 Nov 1994 16:29:31 +0100 (MET)
  4.  
  5. C.S.M.P. Digest             Mon, 07 Nov 94       Volume 3 : Issue 66
  6.  
  7. Today's Topics:
  8.  
  9.         #defines by the compiler (CodeWarrior)
  10.         Announcement: New Mac C++ Programming Book Available
  11.         Apple Guide:  Styled text FUBAR
  12.         Basic GWorlds and QuickDraw Newbie
  13.         CW & Code Resources -- poor?
  14.         Desktop Pictures
  15.         Drag-and-drop to cdev window?
  16.         Fastest way to fill memory with a given value?
  17.         Gestalt Selectors List 2.6
  18.         Global storage in code resources
  19.         How to execute MPW tools without MPW
  20.         MacTCP Completion Routines & Async Nofification
  21.         Memory Management within the Real World
  22.         NewGWorld returns null pointer
  23.         Pathnames? I don't think so...
  24.         Q: Creating Variable sized structures?
  25.         QuickTime + MIDI?
  26.         Software volume locking: HELP!
  27.         Some string routines for the PowerPC
  28.         Tech Notes on the World Wide Web, and History Is Made
  29.  
  30.  
  31.  
  32. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  33. (pottier@clipper.ens.fr).
  34.  
  35. The digest is a collection of article threads from the internet newsgroup
  36. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  37. regularly and want an archive of the discussions.  If you don't know what a
  38. newsgroup is, you probably don't have access to it.  Ask your systems
  39. administrator(s) for details.  If you don't have access to news, you may
  40. still be able to post messages to the group by using a mail server like
  41. anon.penet.fi (mail help@anon.penet.fi for more information).
  42.  
  43. Each issue of the digest contains one or more sets of articles (called
  44. threads), with each set corresponding to a 'discussion' of a particular
  45. subject.  The articles are not edited; all articles included in this digest
  46. are in their original posted form (as received by our news server at
  47. nef.ens.fr).  Article threads are not added to the digest until the last
  48. article added to the thread is at least two weeks old (this is to ensure that
  49. the thread is dead before adding it to the digest).  Article threads that
  50. consist of only one message are generally not included in the digest.
  51.  
  52. The digest is officially distributed by two means, by email and ftp.
  53.  
  54. If you want to receive the digest by mail, send email to listserv@ens.fr
  55. with no subject and one of the following commands as body:
  56.     help                        Sends you a summary of commands
  57.     subscribe csmp-digest Your Name    Adds you to the mailing list
  58.     signoff csmp-digest            Removes you from the list
  59. Once you have subscribed, you will automatically receive each new
  60. issue as it is created.
  61.  
  62. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  63. Questions related to the ftp site should be directed to
  64. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  65. digest are available there.
  66.  
  67. Also, the digests are available to WAIS users.  To search back issues
  68. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  69. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  70.  
  71.  
  72. -------------------------------------------------------
  73.  
  74. >From zobkiw@datawatch.com (joe zobkiw)
  75. Subject: #defines by the compiler (CodeWarrior)
  76. Date: Mon, 17 Oct 1994 13:45:40 GMT
  77. Organization: Datawatch Corporation
  78.  
  79. I have been writing some Aladdin InstallerMaker extensions recently and
  80. have a nice little system that (using two projects and a "switch" in my
  81. main source file) allows me to compile the extension as an application for
  82. easy testing. Then, when I'm done, I can switch projects, switch the
  83. #define switch in my main source file, and compile it as the proper
  84. resource type.
  85.  
  86. My question is, since CodeWarrior doesn't have a nice little "Prefix" type
  87. per-project option like THINK C had, is there another way? It would be
  88. great if the compiler knew what TYPE it was compiling the code as and I
  89. could get at this information in my code. Something like:
  90.  
  91. #ifdef APPL               // APPL is the TYPE of the project
  92.   InitializeMacintoshManagers();
  93. #endif
  94.  
  95. #ifdef IBeg               // IBeg is the RESOURCE TYPE of the project
  96.    SysBeep(0);
  97. #endif
  98.  
  99. Is there another way to accomplish this? Any thoughts?
  100.  
  101. _______________________________________________________ ,,,
  102. Joe Zobkiw                         zobkiw@datawatch.com - -
  103. Senior Software Engineer          Datawatch Corporation  L
  104. ___________ Zeros and Ones will take us there __________ _
  105.  
  106. +++++++++++++++++++++++++++
  107.  
  108. >From mwron@aol.com (MW Ron)
  109. Date: 17 Oct 1994 12:22:03 -0400
  110. Organization: America Online, Inc. (1-800-827-6364)
  111.  
  112. In article <zobkiw-1710940845400001@zobkiw.datawatch.com>,
  113. zobkiw@datawatch.com (joe zobkiw) writes:
  114.  
  115. >>My question is, since CodeWarrior doesn't have a nice little "Prefix"
  116. type per-project option like THINK C had, is there another way? It would
  117. be great if the compiler knew what TYPE it was compiling the code as and I
  118. could get at this information in my code.
  119.  
  120.  
  121. The "Prefix File" option in the Languages Preferences lets you specify
  122. a file that gets automatically prepended to every file. Be default, it is
  123. set to the precompiled header for the Toolbox routines. However, you can
  124. specify your own file.
  125.  
  126. For example, you could specify a Prefix File of  MyPrefix.h, where the
  127. contents of MyPrefix.h was:
  128.  
  129. #include <MacHeaders68K>   // Included precompiled header
  130.             // Define Symbols
  131.  
  132. #ifdef APPL               // APPL is the TYPE of the project
  133.   InitializeMacintoshManagers();
  134. #endif
  135.  
  136. #ifdef IBeg               // IBeg is the RESOURCE TYPE of the project
  137.    SysBeep(0);
  138. #endif
  139.  
  140. Your Prefix File can contain any valid C statements.
  141.  
  142. Ron Liechty
  143. RonL@metrowerks.com
  144. Metrowerks Inc.
  145.  
  146.  
  147.  
  148. ---------------------------
  149.  
  150. >From danparks@aol.com (DanParks)
  151. Subject: Announcement: New Mac C++ Programming Book Available
  152. Date: 15 Oct 1994 16:56:04 -0400
  153. Organization: America Online, Inc. (1-800-827-6364)
  154.  
  155. //******************************************************
  156.    Apologies if this isn't the proper newsgroup for this message.
  157.    I posted it to comp.sys.mac.announce, but it was returned as
  158.          "not acceptable topic for this newsgroup" !!
  159. //******************************************************
  160.  
  161. To All:
  162.  
  163. There's a new Mac programming book now available - "Symantec C++:
  164. Object-Oriented Programming Fundamentals for the Macintosh" by Prima
  165. Publishing. It should be at your bookstore by the time you read this. 
  166.  
  167. "Symantec C++:  Object-Oriented Programming Fundamentals for the
  168. Macintosh"
  169. Dan Parks Sydow
  170. Prima Publishing
  171. ISBN:  1-55958-633-8
  172.  
  173. The book assumes the reader has a knowledge of a higher-level language -
  174. preferably the C language. It also assumes the reader has done at least a
  175. little programming on the Mac. No advanced-level programming skills are
  176. needed, and no previous knowledge of C++ is required.
  177.  
  178. Like my previous Prima book, "Think THINK C", this book comes bundled with
  179. a disk that contains ALL of the source code examples presented in the
  180. book. It also has a tutorial software program that covers the major topics
  181. from the book, from a little different perspective. That program is called
  182. Simulator C++. The purpose of the software is to "bring to life" the
  183. concepts in the book through the use of text, graphics, QuickTime movies,
  184. and on-screen questions and answers.
  185.  
  186. All examples in the book work with Symantec C++ version 6 or version 7.
  187. All examples run on either a 680x0 Mac or a Power Mac. There are a couple
  188. of dozen example programs - most of them short and covering just a single
  189. key topic. But there are also a couple of larger programs that incorporate
  190. many C++/object-oriented programming concepts. Earlier examples stress
  191. basic techniques, later examples stress programming C++ using Macintosh
  192. techniques - writing programs that make use of menus, dialogs, windows,
  193. resources, and graphics.
  194.  
  195. As always, please feel free to send email to me ( addresses shown below)
  196. with any comments/suggestions/kind words/complaints/questions.
  197.  
  198. *Note to CodeWarrior Owners*
  199. If you want to learn C++ programming for the Mac, this book MAY be for
  200. you. You'd have to be willing to skip one chapter of the book, and make
  201. minimal changes to the source code. You CodeWarrior owners shouldn't have
  202. too much trouble adapting the examples to your Metrowerks compiler. You'll
  203. need to create a new project, then add the included source code file to
  204. it. Most source code files need only one or two changes to compile with
  205. CodeWarrior. I'll be posting an errata sheet in this newsgroup next week
  206. for CodeWarrior users. It will detail the changes that need to be made.
  207.  
  208. Internet:  danparks@aol.com
  209. CompuServe:   73747,1401
  210. America Online:  DanParks
  211.  
  212.  
  213. Regards,
  214.  
  215. Dan
  216.  
  217.  
  218.  
  219. +++++++++++++++++++++++++++
  220.  
  221. >From zobkiw@datawatch.com (joe zobkiw)
  222. Date: Mon, 17 Oct 1994 13:38:50 GMT
  223. Organization: Datawatch Corporation
  224.  
  225. In article <37pfl4$t91@newsbf01.news.aol.com>, danparks@aol.com (DanParks)
  226. wrote:
  227.  
  228. > //******************************************************
  229. >    Apologies if this isn't the proper newsgroup for this message.
  230. >    I posted it to comp.sys.mac.announce, but it was returned as
  231. >          "not acceptable topic for this newsgroup" !!
  232. > //******************************************************
  233.  
  234. How could the Macintosh programmers newsgroup not be the right place for
  235. an announcement about a new book about Macintosh programming? :) 
  236.  
  237. This damn info-super-highway has everyone afraid of getting flamed for the
  238. littlest thing, much like most kids in the inner-city are afraid to go to
  239. school because they'll get shot. So what do they do? Skip school and not
  240. post.
  241.  
  242. Dan, it sounds like a good book. Thanks for the info.
  243.  
  244. _______________________________________________________ ,,,
  245. Joe Zobkiw                         zobkiw@datawatch.com - -
  246. Senior Software Engineer          Datawatch Corporation  L
  247. ___________ Zeros and Ones will take us there __________ _
  248.  
  249. ---------------------------
  250.  
  251. >From cwiltgen@mcs.com (Charles Wiltgen)
  252. Subject: Apple Guide:  Styled text FUBAR
  253. Date: Sat, 22 Oct 1994 18:09:26 -0500
  254. Organization: Muso Communications
  255.  
  256. It's a major pain to use styled text in Apple Guide.  Basically, I can't
  257. make any hypertext links stand out because Apple didn't think of including
  258. an "embolden" tag in the dang compiler.
  259.  
  260. What is everyone using to create Apple Guide files with?  SimpleText is
  261. out of the question.  I'd like to use WriteNow, but the GuideMaker crashes
  262. when it tries to read it.
  263.  
  264. Anyone have a solution?
  265.  
  266. -- 
  267. Charles Wiltgen    "Love is a snowmobile racing across the tundra and
  268. cwiltgen@mcs.com    then suddenly it flips over, pinning you underneath.
  269. (INTP)              At night, the ice weasels come." - Nietzsche (Groening)
  270. The Apocalypso!     http://www.mcs.net/~cwiltgen
  271.  
  272. +++++++++++++++++++++++++++
  273.  
  274. >From quinn@cs.uwa.edu.au (Quinn "The Eskimo!")
  275. Date: Sun, 23 Oct 1994 11:01:58 +0800
  276. Organization: Department of Computer Science, The University of Western Australia
  277.  
  278. In article <cwiltgen-2210941809260001@cwiltgen.pr.mcs.net>,
  279. cwiltgen@mcs.com (Charles Wiltgen) wrote:
  280.  
  281. >It's a major pain to use styled text in Apple Guide.  Basically, I can't
  282. >make any hypertext links stand out because Apple didn't think of including
  283. >an "embolden" tag in the dang compiler.
  284.  
  285. Yep, I've found this very annoying too.  I basically gave up on hot text,
  286. at least for the moment.
  287.  
  288. >What is everyone using to create Apple Guide files with?
  289.  
  290. I use TexEdit.  It's a pretty cool shareware styled text editor.  [And
  291. yes, I have sent off my shareware payment.]  Unfortunately there's no XTND
  292. filter for it, so the styles don't move across to AG.
  293.  
  294. >I'd like to use WriteNow, but the GuideMaker crashes
  295. >when it tries to read it.
  296.  
  297. I had *exactly* the same problem.  I think (god forbid) that MS Word might
  298. be a good choice.  As long as you restrict yourself to the core features
  299. it's fairly nice and the XTND filters are likely to be more stable. 
  300. However my hard disk is Microsloth-free, which eliminates this option for
  301. me.
  302.  
  303. Share and Enjoy.
  304. --
  305. Quinn "The Eskimo!"      "I wasn't the one who fired the heat seeking
  306.                           population annihilator out the window!"
  307.  
  308. +++++++++++++++++++++++++++
  309.  
  310. >From cwiltgen@mcs.com (Charles Wiltgen)
  311. Date: Sun, 23 Oct 1994 12:43:14 -0500
  312. Organization: Muso Communications
  313.  
  314. In article <quinn-2310941101580001@mac163.cs.uwa.oz.au>,
  315. quinn@cs.uwa.edu.au (Quinn "The Eskimo!") wrote:
  316.  
  317. > >It's a major pain to use styled text in Apple Guide.  Basically, I can't
  318. > >make any hypertext links stand out because Apple didn't think of including
  319. > >an "embolden" tag in the dang compiler.
  320. > Yep, I've found this very annoying too.  I basically gave up on hot text,
  321. > at least for the moment.
  322.  
  323. That's potentially one of the Best Thingsª about Apple Guide, and we can't
  324. use it because there's no way to find out what what's hot-clickable.  I'm
  325. going to use Word on one of my smaller files (but I'm afraid!) or go to
  326. some sort of Çclick hereÈ notation for now.
  327.  
  328. > >I'd like to use WriteNow, but the GuideMaker crashes
  329. > >when it tries to read it.
  330. > I had *exactly* the same problem.  I think (god forbid) that MS Word might
  331. > be a good choice.  As long as you restrict yourself to the core features
  332. > it's fairly nice and the XTND filters are likely to be more stable. 
  333. > However my hard disk is Microsloth-free, which eliminates this option for
  334. > me.
  335.  
  336. Thanks for the confirmation.  I got WriteNow for $12.95 when I ordered
  337. something from MacWarehouse (don't tell anyone about this special offer!)
  338. and thought it would be perfect for this.  Alas, it was not to be.
  339.  
  340. C'mon, Apple!  Add those <B>style</B> tags!!!
  341.  
  342. -- 
  343. Charles Wiltgen    "Love is a snowmobile racing across the tundra and
  344. cwiltgen@mcs.com    then suddenly it flips over, pinning you underneath.
  345. (INTP)              At night, the ice weasels come." - Nietzsche (Groening)
  346. The Apocalypso!     http://www.mcs.net/~cwiltgen
  347.  
  348. +++++++++++++++++++++++++++
  349.  
  350. >From cwiltgen@mcs.com (Charles Wiltgen)
  351. Date: Sun, 23 Oct 1994 13:41:56 -0500
  352. Organization: Muso Communications
  353.  
  354. In article <cwiltgen-2310941243140001@cwiltgen.pr.mcs.net>,
  355. cwiltgen@mcs.com (Charles Wiltgen) wrote:
  356.  
  357. > > I think (god forbid) that MS Word might
  358. > > be a good choice.  As long as you restrict yourself to the core features
  359. > > it's fairly nice and the XTND filters are likely to be more stable. 
  360. > > However my hard disk is Microsloth-free, which eliminates this option for
  361. > > me.
  362.  
  363. Nope, Word doesn't work either (although Guide reads Word files fine).
  364.  
  365. Can someone from Apple help?  I've already started doing my hot words like
  366. «this»...
  367.  
  368. -- 
  369. Charles Wiltgen    "Love is a snowmobile racing across the tundra and
  370. cwiltgen@mcs.com    then suddenly it flips over, pinning you underneath.
  371. (INTP)              At night, the ice weasels come." - Nietzsche (Groening)
  372. The Apocalypso!     http://www.mcs.net/~cwiltgen
  373.  
  374. ---------------------------
  375.  
  376. >From jpo6@po.CWRU.Edu (Jared P. O'neal)
  377. Subject: Basic GWorlds and QuickDraw Newbie
  378. Date: 18 Oct 1994 21:28:47 GMT
  379. Organization: Case Western Reserve University, Cleveland, Ohio (USA)
  380.  
  381.  
  382. I've created a GWorld, at least I think I have.  Then, I used the
  383. GetGWorldPixMap() call to get the handle of the PixMap.  All I wanted to do was
  384. use CopyBits to take a picture I had put into the GWorld w/ DrawPicture onto a
  385. window I had created, but when I tried it, it didn't copy anything into the 
  386. window.  When I tried to debug it (just how do you debug a GWorld), I noticed
  387. that the baseaddr was 0, which doesn't seem right.  Is there anything I did 
  388. wrong here?  (I left out the error handling stuff)
  389.  
  390. GetGWorld(&origPort, &origDev);
  391.     myErr = NewGWorld(&myGWorldPtr, 0, &myRect, nil, nil, 0);
  392.     SetGWorld(myGWorldPtr, nil);
  393.     myPixMapHnd = GetGWorldPixMap(myGWorldPtr);
  394.     good = LockPixels(myPixMapHnd);
  395.     wndoRect = myGWorldPtr->portRect;
  396.     EraseRect(&wndoRect);
  397.  
  398. if (PictID != 0)
  399.     {
  400.         myPic = GetPicture(PictID);
  401.         DrawPicture(myPic, &myRect);
  402.     }
  403.     
  404.     SetGWorld(origPort, origDev);
  405.     
  406.     SetPort(wp);
  407.     
  408. CopyBits((BitMap *)*myPixMapHnd, (BitMap *)wp, &wndoRect, &(wp->portRect), 0, nil);
  409.  
  410. where wp is the WindowPtr of the destination window.
  411.  
  412. --Jared
  413. -- 
  414. Philosophy:  Master the colonel's secret blend of herbs & spices and all the 
  415. secrets of the universe will be yours!?!
  416.  
  417. Jared O'Neal aka jpo6@po.cwru.edu or oneale@ucsub.colorado.edu or JaredO@aol.co
  418.  
  419. +++++++++++++++++++++++++++
  420.  
  421. >From first.ascent@mindlink.bc.ca (Alex Curylo)
  422. Date: 19 Oct 1994 07:43:58 GMT
  423. Organization: First Ascent
  424.  
  425. In article <381emf$d5d@usenet.INS.CWRU.Edu>
  426. jpo6@po.CWRU.Edu (Jared P. O'neal) writes:
  427.  
  428. > Is there anything I did wrong here?
  429. >CopyBits((BitMap *)*myPixMapHnd, (BitMap *)wp, &wndoRect, &(wp->portRect), 0, nil);
  430.  
  431. Yes. (BitMap *)*myPixMapHnd is wrong. Changing that to
  432. &((GrafPtr)myGWorldPtr)->portBits should make it work just fine. And
  433. (BitMap*)wp is wrong too. You want &((GrafPtr)wp)->portBits.
  434.  
  435. +++++++++++++++++++++++++++
  436.  
  437. >From gbolsinga@aol.com (GBolsinga)
  438. Date: 19 Oct 1994 15:24:02 -0400
  439. Organization: America Online, Inc. (1-800-827-6364)
  440.  
  441. In article <382inu$idq@deep.rsoft.bc.ca>, first.ascent@mindlink.bc.ca
  442. (Alex Curylo) writes:
  443.  
  444. >Yes. (BitMap *)*myPixMapHnd is wrong. Changing that to
  445. >&((GrafPtr)myGWorldPtr)->portBits should make it work just fine. And
  446.  
  447. This is wrong! To quote NIM: Imaging With QuickDraw:
  448. "To ensure compatibility on systems running basic QuickDraw instead of
  449. Color Quickdraw, use GetGWorldPixMap whenever you need to gain
  450. access to the bitmap created for a graphics world--that is, do NOT 
  451. dereference the GWorldPtr record for that graphics world."
  452.  
  453. The funny thing is, all the code samples for CopyBIts in the book that I
  454. saw do the WRONG thing.  So many manuals, so little time... :)
  455.  
  456. The problem is with the second (destination) Bitmap: change it to:
  457.  
  458. &((GrafPtr)wp)->portBits
  459.  
  460. and thing should be fine.
  461.  
  462. Greg Bolsinga
  463. MPI Multimedia
  464.  
  465. +++++++++++++++++++++++++++
  466.  
  467. >From first.ascent@mindlink.bc.ca (Alex Curylo)
  468. Date: 24 Oct 1994 09:15:00 GMT
  469. Organization: First Ascent
  470.  
  471. In article <rac-2110941951310001@intrigue.intrigue.com>
  472. rac@intrigue.com (Robert Coie) writes:
  473.  
  474. > A word of caution about GetGWorldPixMap -- it was severely broken in
  475. > pre-7.0 systems.  I think it grabbed a half word instead of a full 32-bit
  476. > word.  If you are certain to be running on a post-7.0 system,
  477. > GetGWorldPixMap should be OK.  If you are certain that Color QuickDraw is
  478. > present and are concerned about System 6 compatibility, do the direct
  479. > dereference.
  480.  
  481. Yes indeed. Version 1.2, to be exact. Like this:
  482.  
  483.     // GetGWorldPixMap doesn't work in 32CQD 1.2
  484.     gLameCQD = (qdVersion >= gestalt32BitQD) && (qdVersion <
  485. gestalt32BitQD13);
  486.  
  487. // workaround for GetGWorldPixMap bug in CQD 1.2
  488. PixMapHandle OurGetGWorldPixMap(GWorldPtr world)
  489. {
  490.  if (gLameCQD)
  491.      return ((CGrafPtr)world)->portPixMap;
  492.  else
  493.      return GetGWorldPixMap(world);
  494. }
  495.  
  496. But in the particular case of CopyBits,
  497. &((GrafPtr)myGWorldPtr)->portBits really does always work. Up to 7.5,
  498. anyway.
  499.  
  500. ---------------------------
  501.  
  502. >From afrancke@netcom.com (Andrew Francke)
  503. Subject: CW & Code Resources -- poor?
  504. Date: Wed, 12 Oct 1994 03:00:02 GMT
  505. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  506.  
  507. After perusing CodeWarrior C for a little Component Manager
  508. development, I've formed the following reactions. Please respond with
  509. the approriate answers.
  510.  
  511. Is it just me, or:
  512.  
  513. * is there no way to create a single-segment code resource that uses
  514.   the MW ANSI libs?
  515.  
  516. * does the faux-segment loader just plain not work when the code
  517.   resource's resource fork isn't open? when there are multiple
  518.   multi-segment resources in the same file?
  519.  
  520. * is there no way to have the following declaration in an MW
  521.   code resource:
  522.  
  523.     char *foo = "bar"
  524.  
  525. If the answer to the first question is "yes," when will MW ship an
  526. intelligent linker? Yes, yes -- it's way better than the
  527. THINK/Symantec linker in its identification of dead code. That doesn't
  528. matter if it's convinced you need multiple segments based on the
  529. *un*stripped code/data size.
  530.  
  531. If the answer to any part of the second question is "yes," when will
  532. MW either: document the secret inner-workings of the multi-segment
  533. glue? Heck, if the answer is *no,* when will MW document it?
  534.  
  535. The third question is based on the fuzzy observation (i.e., I didn't
  536. ATFCO -- adjust the compiler options) that a struct with a char *
  537. member could not be initialized with a static string.
  538.  
  539. Finally -- on an entirely unrelated note -- when will somebody prepare
  540. a runtime library for MPW C-generated .o files that need such fine
  541. symbols as _iob and LDIVU -- that can then be used in MW projects.
  542.  
  543. +++++++++++++++++++++++++++
  544.  
  545. >From isochrome@aol.com (IsoChrome)
  546. Date: 13 Oct 1994 14:10:01 -0400
  547. Organization: America Online, Inc. (1-800-827-6364)
  548.  
  549. In article <afranckeCxJHo3.JD3@netcom.com>, afrancke@netcom.com (Andrew
  550. Francke) writes:
  551.  
  552. > * does the faux-segment loader just plain not work when the code
  553. >  resource's resource fork isn't open? when there are multiple
  554. >  multi-segment resources in the same file?
  555.  
  556. I've had the same problem with CW (we're writing 'cmm ' components). The
  557. component manager seems to cache the component code, so your resource fork
  558. isn't open when you are called. It looks like CW keeps some sort of jump
  559. table information in a separate resource ('cmmx' for 'cmm 's). The kiss of
  560. death is that the resource is loaded before a single line of your code is
  561. executed (to get the address of main maybe?), so there is no way you can
  562. open the resource fork yourself. I've had to punt and compile the 68K
  563. piece in Symantec and the PPC piece in CodeWarrior.
  564.  
  565. John Sarapata
  566.  
  567. +++++++++++++++++++++++++++
  568.  
  569. >From hanrek@cts.com (Mark Hanrek)
  570. Date: Sun, 16 Oct 1994 07:53:44 GMT
  571. Organization: The Information Worskhop
  572.  
  573. In article <afranckeCxJHo3.JD3@netcom.com>, afrancke@netcom.com (Andrew
  574. Francke) wrote:
  575.  
  576. Try posting your question in "comp.sys.mac.programmer.codewarrior" which
  577. you may not have known existed.  It's new, and you may find an answer to
  578. your question already posted, as I remember reading something along these
  579. lines recently.
  580.  
  581. Mark Hanrek
  582.  
  583. +++++++++++++++++++++++++++
  584.  
  585. >From richardb@cocytus.demon.co.uk (Richard Buckle)
  586. Date: Tue, 18 Oct 1994 07:51:57 GMT
  587. Organization: none
  588.  
  589. In article <afranckeCxJHo3.JD3@netcom.com>,
  590. afrancke@netcom.com (Andrew Francke) wrote:
  591.  
  592. >* is there no way to create a single-segment code resource that uses
  593. >  the MW ANSI libs?
  594.  
  595. Not if you want to use any vaguely useful ANSI function, such as pow() or
  596. tolower(). The problem is the dead-code stripping can't see through
  597. libraries.
  598. I've repeatedly suggested that MW sort this out and in the interim either
  599. distribute cut-down ANSI libraries (string.lib, math.lib etc) without
  600. 32-bit links hard-wired in or at the very least distribute a 68020 build. I
  601. have got *nowhere*.
  602.  
  603. >* does the faux-segment loader just plain not work when the code
  604. >  resource's resource fork isn't open? when there are multiple
  605. >  multi-segment resources in the same file?
  606.  
  607. Basically yes. It can also crash horribly if your multi-segment resource is
  608. unlocked between calls to it and moves, as the 32-bit jumps do not get
  609. remade. UnloadA4Seg() does not help. I have asked MW to provide a way to
  610. tell the multi-segment resource to remake its jumps, such as calling
  611. UnloadA4Seg(NULL), but this too has fallen on deaf ears. 
  612. Dammit, I feel strongly I should be entitled to unlock my code resources
  613. between calls to them.
  614. As I have no control over the third party app calling my code resource, I
  615. have been reduced to building a stub single-seg resource that calls the
  616. multi-seg resource, runs it and disposes of it to suit MW's brain-damaged
  617. segmentation scheme. Mail me if you want details.
  618.  
  619. The whole segmentation thing on CodeWarrior *sucks*, on apps as well as
  620. code resources. See a thread by Steve Dorner a while ago for a description
  621. of the pure evil that is the application segment loader under CW.
  622.  
  623. A dreadful shame, as this apart from this huge blind spot MW have a *very*
  624. fine product. Maybe some more net.pressure will do the trick.
  625.  
  626.  
  627. - -----------------------------------------------------
  628. Richard Buckle
  629. richardb@cocytus.demon.co.uk
  630. Using this darned fine NewsHopper thingy.
  631.  
  632.  
  633. +++++++++++++++++++++++++++
  634.  
  635. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  636. Date: Tue, 18 Oct 1994 17:26:12 GMT
  637. Organization: Apple Computer
  638.  
  639. Andrew Francke, afrancke@netcom.com writes:
  640. > * does the faux-segment loader just plain not work when the code
  641. >   resource's resource fork isn't open? when there are multiple
  642. >   multi-segment resources in the same file?
  643.  
  644. I believe it will work as long as you preload and detach the code segments.
  645. The loader obviously can't magically know how to open the resource file to
  646. get the code.
  647.  
  648. > * is there no way to have the following declaration in an MW
  649. >   code resource:
  650. >     char *foo = "bar"
  651.  
  652. Should work fine as long as A4 is set up properly at the time that the global
  653. data is referenced.
  654.  
  655. I've directed follow-ups to c.s.m.p.codewarrior.
  656.  
  657. --Jens Alfke                           jens_alfke@powertalk.apple.com
  658.                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  659.  
  660. +++++++++++++++++++++++++++
  661.  
  662. >From ejr@netcom.com (Erik J. Rogers)
  663. Date: Thu, 20 Oct 1994 01:59:30 GMT
  664. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  665.  
  666. In article <1994Oct18.172612.15440@gallant.apple.com> wrote:
  667. : > * is there no way to have the following declaration in an MW
  668. : >   code resource:
  669. : >     char *foo = "bar"
  670.  
  671. : Should work fine as long as A4 is set up properly at the time that the global
  672. : data is referenced.
  673.  
  674. Try using:
  675.     char foo[] = "bar";
  676.  
  677. See "ReadMe Second" in WDEF sample of resource samples of CW CD for details.
  678.  
  679. Erik J. Rogers
  680.  
  681. ---------------------------
  682.  
  683. >From jacobowi@crab.rutgers.edu (Howard Jacobowitz)
  684. Subject: Desktop Pictures
  685. Date: 16 Oct 1994 13:34:52 -0400
  686. Organization: Rutgers University
  687.  
  688. I know of at least three INIT/cdev's that replaces the standard
  689. desktop pattern with a PICT.  HOW?!?!?!?!?
  690. I think it involves patching FillCRect/FillCRgn, althoug I've no idea why.
  691.  
  692. +++++++++++++++++++++++++++
  693.  
  694. >From h+@nada.kth.se (Jon W{tte)
  695. Date: Mon, 17 Oct 1994 11:09:43 +0100
  696. Organization: Royal Institute of Something or other
  697.  
  698. In article <37ro7s$5ki@crab.rutgers.edu>,
  699. jacobowi@crab.rutgers.edu (Howard Jacobowitz) wrote:
  700.  
  701. >I know of at least three INIT/cdev's that replaces the standard
  702. >desktop pattern with a PICT.  HOW?!?!?!?!?
  703. >I think it involves patching FillCRect/FillCRgn, althoug I've no idea why.
  704.  
  705. This happens to do that, and also replace SysBeep() with a 
  706. predetermined sound, and also play a sound at startup.
  707.  
  708. This particular feature set was used for freshman education
  709. earlier this year :-)
  710.  
  711. You can make it go faster by creating a GWorld and draw the 
  712. picture into it, and use CopyBits, and also re-create the 
  713. GWorld everytime the color environment changes. Cache the PICT 
  714. to disk when you do, instead of keeping it, too, in memory.
  715.  
  716. Compile with Think C 7
  717.  
  718. //    Note:
  719. //    Build this as an INIT; the resource flags HAVE to be System Heap, Locked and Preload
  720. //
  721. //    Install two "snd " resources; 4000 for the system beep and 4001 for the
  722. //    startup sound
  723. //    Both these resources HAVE to have the System Heap and Locked bits set;
  724. //    it helps if they also have the Preload bit set (in Resource info in ResEdit)
  725. //
  726. //    Install a PICT resource; ID 4000. This PICT HAS to have the System Heap and Locked
  727. //    bits set; it helps with the Preload bit as well (in Resource info in ResEdit)
  728. //    This PICT will be drawn in the background (on the desktop) - note that the PICT
  729. //    has to be rectangular (square) and the same size as your screen(s) to look best.
  730. //
  731. //    Screen sizes are:
  732. //    PowerBook        640x400
  733. //    13"/14"            640x480
  734. //    15" portrait    640x870
  735. //    16"/17"            832x624
  736. //    19"                1024x768
  737. //    19"/21"            1182x870
  738. //
  739. //    ©1994 Jon Wätte    h+@nada.kth.se
  740.  
  741.  
  742. #include <SetupA4.h>
  743. #include <Traps.h>
  744. #include <Sound.h>
  745.  
  746.  
  747. Handle theBeep = NULL ;
  748.  
  749. static pascal void
  750. DoBeep ( short time )
  751. {
  752.     SetUpA4();
  753.     if ( theBeep ) {
  754.         SndPlay ( NULL , theBeep , false ) ;
  755.     }
  756.     RestoreA4();
  757. }
  758.  
  759.  
  760. static void
  761. PlayStart ( )
  762. {
  763.     Handle h = GetResource ( 'snd ' , 4001 ) ;
  764.     if ( h ) {
  765.         SndPlay ( NULL , h , false ) ;
  766.         ReleaseResource ( h ) ;
  767.     }
  768. }
  769.  
  770.  
  771. pascal void ( * oldFillCRgn ) ( RgnHandle rgn , PixPatHandle pat ) ;
  772.  
  773. PicHandle thePict = NULL ;
  774.  
  775.  
  776. static pascal void
  777. DrawDesk ( RgnHandle rgn , PixPatHandle pat )
  778. {
  779.     SetUpA4 ( ) ;
  780.     if ( ! EmptyRgn ( rgn ) )
  781.     {
  782.         // DeskCPat -- only works on color QD machines
  783.         if ( ( pat == * ( PixPatHandle * ) 0xcd8 ) &&
  784.             ( thePict != NULL ) )
  785.         {
  786.             RgnHandle clip = NewRgn ( ) ;
  787.             RgnHandle temp = NewRgn ( ) ;
  788.             Rect r = ( * * GetGrayRgn ( ) ) . rgnBBox ;
  789.             GetClip ( clip ) ;
  790.             SectRgn ( clip , rgn , temp ) ;
  791.             SetClip ( temp ) ;
  792.             DisposeRgn ( temp ) ;
  793.             if ( r . top > 0 )
  794.                 r . top = 0 ;
  795.             DrawPicture ( thePict , & r ) ;
  796.             SetClip ( clip ) ;
  797.             DisposeRgn ( clip ) ;
  798.         }
  799.         else
  800.         {
  801.             ( * oldFillCRgn ) ( rgn , pat ) ;
  802.         }
  803.     }
  804.     RestoreA4 ( ) ;
  805. }
  806.  
  807.  
  808. main()
  809. {
  810.     // Some glue to safely install ourselves
  811.     asm {
  812.         move.l a0,-(a7)
  813.         dc.w 0xa128 // _RecoverHandle
  814.         move.l a0,-(a7)
  815.         dc.w 0xa992 // _DetachResource
  816.         move.l (a7)+,a0
  817.     }
  818.     RememberA0();
  819.     SetUpA4();
  820.     PlayStart ( ) ;
  821.     if ( ! Button ( ) )
  822.     {
  823.         if ( ( thePict = ( PicHandle ) GetResource ( 'PICT' , 4000 ) ) != NULL )
  824.         {
  825.             DetachResource ( ( Handle ) thePict ) ;
  826.             oldFillCRgn = ( pascal void ( * ) ( RgnHandle , PixPatHandle ) ) GetToolTrapAddress ( 0xaa12 ) ;
  827.             SetToolTrapAddress ( ( ProcPtr ) DrawDesk , 0xaa12 ) ;
  828.         }
  829.  
  830.         theBeep = GetResource ( 'snd ' , 4000 ) ;
  831.         if ( theBeep ) {
  832.             DetachResource ( theBeep ) ;
  833.             SetToolTrapAddress ( ( ProcPtr ) DoBeep , 0xA9C8 ) ; // SysBeep
  834.         }
  835.     }
  836.     RestoreA4();
  837. }
  838.  
  839.  
  840.  
  841. --
  842.   Jon Wätte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  843.  
  844. "Smart Friends ask no SCSI questions!"
  845.     — Apple employee at the Bash
  846.  
  847.  
  848. ---------------------------
  849.  
  850. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  851. Subject: Drag-and-drop to cdev window?
  852. Date: 10 Oct 94 16:47:53 +1300
  853. Organization: University of Waikato, Hamilton, New Zealand
  854.  
  855. I'm writing this control panel which supports the Drag Manager. I've hit an
  856. odd problem: dragging Finder clipping files to my window doesn't seem to work.
  857.  
  858. I stepped through my drag-tracking handler with MacsBug, and watched it check
  859. for a PICT item type, by calling GetFlavorDataSize. If there is no PICT type,
  860. I get badDragFlavorErr = -1852, which makes sense. If there _is_ a PICT type,
  861. I get cantGetFlavorErr = -1854 instead.
  862.  
  863. If I drag a PICT item from another application to my control panel window,
  864. it works OK, so I figure a bug in my code is unlikely. :-)
  865.  
  866. Anybody else encountered this? Maybe the problem is that control panels
  867. run in the Finder's context, and its peculiar uses of the Drag Manager don't
  868. allow for this.
  869.  
  870. Any ideas welcomed.
  871.  
  872. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  873. Info & Tech Services Division              fax: +64-7-838-4066
  874. University of Waikato            electric mail: ldo@waikato.ac.nz
  875. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00
  876.  
  877. +++++++++++++++++++++++++++
  878.  
  879. >From jumplong@aol.com (Jump Long)
  880. Date: 11 Oct 1994 01:03:03 -0400
  881. Organization: America Online, Inc. (1-800-827-6364)
  882.  
  883. In article <1994Oct10.164754.34014@waikato.ac.nz>, ldo@waikato.ac.nz
  884. (Lawrence D'Oliveiro, Waikato University) writes:
  885.  
  886. >I'm writing this control panel which supports the Drag Manager. I've hit
  887. >an odd problem: dragging Finder clipping files to my window doesn't seem
  888. >to work.
  889.  
  890. We had the same report at work and the answer is, it won't work.  I can't
  891. remember the reason why, but Nitin tracked it down.
  892.  
  893. - Jim Luther
  894.  
  895. ---------------------------
  896.  
  897. >From rej@chinook.halcyon.com (Randy Jones)
  898. Subject: Fastest way to fill memory with a given value?
  899. Date: 14 Oct 1994 17:58:54 GMT
  900. Organization: NWNEXUS, Inc. - We Make Internet Easy
  901.  
  902. I want to fill a given block of memory with copies of a long.
  903. I'm guessing there has to be a faster way than a loop which
  904. sets each word in turn.  BlockMove, for example, runs faster
  905. than a copy loop.  But there's no Mac toolbox equivalent of 
  906. memset that I've found.  
  907.  
  908. Are compilers smart enough to turn my loop of word writes into 
  909. something faster, maybe involving the MMU?  If not, then what
  910. am I missing?  Think and/or MetroWerks C, BTW.
  911.  
  912. --Randy Jones
  913.  
  914.  
  915.  
  916. +++++++++++++++++++++++++++
  917.  
  918. >From relmore@halcyon.com (Richard Elmore)
  919. Date: Sat, 15 Oct 1994 01:54:09 -0800
  920. Organization: Northwest Nexus Inc.
  921.  
  922. In article <37mgsu$opv@news.halcyon.com>, rej@chinook.halcyon.com (Randy
  923. Jones) wrote:
  924.  
  925. > I want to fill a given block of memory with copies of a long.
  926. > I'm guessing there has to be a faster way than a loop which
  927. > sets each word in turn.  BlockMove, for example, runs faster
  928. > than a copy loop.  But there's no Mac toolbox equivalent of 
  929. > memset that I've found.  
  930.  
  931. The most common way to speed up mem copy/fill operations is to unroll your
  932. loop.  That is, instead of copying one long word during each iteration of
  933. your loop copy several.  This is in fact the approach taken by
  934. _BlockMove.  Another thing that will make a difference is to make sure all
  935. of your moves are longword aligned (ever notice how Hypercard snaps its
  936. windows an invisible grid on the screen, thats why).
  937.  
  938. -- 
  939. Richard Elmore
  940. relmore@halcyon.com
  941.  
  942. +++++++++++++++++++++++++++
  943.  
  944. >From Arnold Kim <ahk12@columbia.edu>
  945. Date: 16 Oct 1994 20:26:04 GMT
  946. Organization: Nemesis Productions
  947.  
  948. In article <37mgsu$opv@news.halcyon.com> Randy Jones,
  949. rej@chinook.halcyon.com writes:
  950. > I want to fill a given block of memory with copies of a long.
  951. > I'm guessing there has to be a faster way than a loop which
  952. > sets each word in turn.  BlockMove, for example, runs faster
  953. > than a copy loop.  But there's no Mac toolbox equivalent of 
  954. > memset that I've found.  
  955.  
  956. If you want an only-68k solution, then probably the fastest you'll get is
  957. the "movem" command in 68000 assembly.
  958.  
  959. What it does is move the contents of multiple registers into a desired
  960. memory location.... so....
  961.  
  962. initialize all registers as 0x11111111
  963. set a7 as the pointer to where you're writing
  964.  
  965. movem.l  a0-a6/d0-d7,(a7)+
  966.  
  967. that'll blast out 15 longs where (a7) is...
  968.  
  969. (that's probably not the exact syntax, and you'd want to preserve a7,
  970. amongst other things... but that's the gist of it - check a 680x0
  971. assembly book)
  972.  
  973. arnold
  974.  
  975. +++++++++++++++++++++++++++
  976.  
  977. >From resnick@uiuc.edu (Pete Resnick)
  978. Date: Mon, 17 Oct 1994 01:26:18 -0500
  979. Organization: University of Illinois at Urbana-Champaign
  980.  
  981. In article <37s28s$5mi@apakabar.cc.columbia.edu>, Arnold Kim
  982. <ahk12@columbia.edu> wrote:
  983.  
  984. > In article <37mgsu$opv@news.halcyon.com> Randy Jones,
  985. > rej@chinook.halcyon.com writes:
  986. > > I want to fill a given block of memory with copies of a long.
  987. > If you want an only-68k solution, then probably the fastest you'll get is
  988. > the "movem" command in 68000 assembly.
  989.  
  990. Yes, both MOVEM, and MOVE16 on 68040's, are very good block move
  991. instructions. There are lots of ways to use them in creative ways.
  992.  
  993. > initialize all registers as 0x11111111
  994. > set a7 as the pointer to where you're writing
  995. > movem.l  a0-a6/d0-d7,(a7)+
  996.  
  997. Aside from the syntax being bad (you can only work with pre-decrement in
  998. this mode, not post-increment), even using that would be *very* bad. You
  999. don't want to use A7 unless you disable interrupts, since any interrupt
  1000. that comes through will allocate space on the stack where A7 currently
  1001. points. If you want to use this method, leave A7 alone completely, move
  1002. the address of the end of the block into one of the other address
  1003. registers, move the value you want into all of the other registers, and
  1004. then do the MOVEM. Here's some sample code I wrote to do a block clear, 52
  1005. bytes at a time (4 bytes per register in 13 registers):
  1006.  
  1007. ; Written in THINK C assembler, so some of the syntax is wierd
  1008. ; Start with the address of block to clear in A0 and the length in D0
  1009.  
  1010.         move.l  d1,-(sp)    ; 12
  1011.         moveq   #0,d1       ;  4
  1012.         adda.l  d0,a0       ;  8
  1013.         cmpa.w  #1,a0       ; 10
  1014.         bcs.s   @0          ;  8/10
  1015.         move.b  d1,-(a0)    ;  8
  1016.         subq.l  #1,d0       ;  8
  1017.     @0  cmpi.l  #160,d0     ; 14
  1018.         blt.s   @5          ; 10/8
  1019.  
  1020.         swap    d0                      ;  4
  1021.         move.w  d0,d1                   ;  4
  1022.         beq.s   @1                      ;  8/10
  1023.         divu.w  #52,d1                  ;144
  1024.         swap    d1                      ;  4
  1025.         move.w  d1,d0                   ;  4
  1026.     @1  swap    d0                      ;  4
  1027.         divu.w  #52,d0                  ;144
  1028.         move.w  d0,d1                   ;  4
  1029.         clr.w   d0                      ;  4
  1030.         swap    d0                      ;  4
  1031.         movem.l d0/d2-d7/a1-a6,-(sp)    ;112
  1032.         move.l  d1,d0                   ;  4
  1033.         moveq   #0,d1                   ;  4
  1034.         move.l  d1,d2                   ;  4
  1035.         move.l  d1,d3                   ;  4
  1036.         move.l  d1,d4                   ;  4
  1037.         move.l  d1,d5                   ;  4
  1038.         move.l  d1,d6                   ;  4
  1039.         move.l  d1,d7                   ;  4
  1040.         move.l  d1,a1                   ;  4
  1041.         move.l  d1,a2                   ;  4
  1042.         move.l  d1,a3                   ;  4
  1043.         move.l  d1,a4                   ;  4
  1044.         move.l  d1,a5                   ;  4
  1045.         move.l  d1,a6                   ;  4
  1046.         bra.s   @4                      ; 10
  1047.     @2  swap    d0                      ;  4
  1048.     @3  movem.l d1-d7/a1-a6,-(a0)       ;112
  1049.     @4  dbra    d0,@3                   ; 14/10
  1050.         swap    d0                      ;  4
  1051.         dbra    d0,@2                   ; 14/10
  1052.         movem.l (sp)+,d0/d2-d7/a1-a6    ;116 = 770
  1053.  
  1054.     @5  bclr    #2,d0       ; 14
  1055.         beq.s   @6          ;  8/10
  1056.         move.w  d1,-(a0)    ;  8
  1057.     @6  addq.b  #1,d0       ;  4
  1058.         lsr.l   #2,d0       ; 12
  1059.         bra.s   @9          ; 10
  1060.     @7  swap    d0          ;  4
  1061.     @8  move.l  d1,-(a0)    ; 12
  1062.     @9  dbra    d0,@8       ; 14/10
  1063.         swap    d0          ;  4
  1064.         dbra    d0,@7       ; 14/10
  1065.         addx.w  d0,d0       ;  4
  1066.         bpl.s   @10         ;  8/10
  1067.         move.b  d1,-(a0)    ;  8
  1068.     @10 move.l  (sp)+,d1    ; 12
  1069.         rts                 ; 16 = 252 +
  1070.  
  1071.  
  1072. pr
  1073. -- 
  1074. Pete Resnick    (...so what is a mojo, and why would one be rising?)
  1075. Doctoral Student - Philosophy Department, Gregory Hall, UIUC
  1076. System manager - Cognitive Science Group, Beckman Institute, UIUC
  1077. Internet: resnick@uiuc.edu
  1078.  
  1079. ---------------------------
  1080.  
  1081. >From rgaros@bio.vu.nl (Rene G.A. Ros)
  1082. Subject: Gestalt Selectors List 2.6
  1083. Date: Wed, 12 Oct 1994 07:53:12 GMT
  1084. Organization: VU Biology, Amsterdam, The Netherlands
  1085.  
  1086. Dear Mac-programmers,
  1087.  
  1088.  
  1089. Today I released version 2.6 of the
  1090.  
  1091.  
  1092.                        Gestalt Selectors List (GSL)
  1093.  
  1094.  
  1095. This list celibrates its second anniversary today.
  1096.  
  1097. It lists all sorts of information about the Gestalt Manager, but mainly
  1098. about selectors and the meaning of the returned values.
  1099. The Gestalt Manager is part of the Apple Macintosh System Software to
  1100. enable programmers to determine the availability of certain software and
  1101. hardware.
  1102.  
  1103. You can obtain the latest version in several ways:
  1104. - by sending an email to the mail archive server:
  1105.       gestalt-selectors-list-request@bio.vu.nl
  1106.   with as subject:
  1107.       archive get recent/gestalt-selectors.etx
  1108.   or to get the compressed version:
  1109.       archive get recent/gestalt-selectors.sit.hqx
  1110.  
  1111. - FTP to the info-mac archives at sumex-aim.stanford.edu and get the file
  1112.       /info-mac/dev/info/gestalt-selectors-26.hqx
  1113.   You can also use any of its mirror sites.
  1114.  
  1115. - World Wide Web
  1116.   The GSL is also available, together with other Macintosh FAQs, at:
  1117.       http://www.astro.nwu.edu/lentz/mac/faqs/source/gestalt.html
  1118.  
  1119. - CompuServe members can find it at the Macintosh Developers Forum
  1120.   (GO MACDEV) in the Tools/Debuggers section.
  1121.  
  1122. - Subscribers of the maillist have received their copy already.
  1123.   If you want to join this list you need to send an email to:
  1124.       gestalt-selectors-list-request@bio.vu.nl
  1125.   with in the subject line 'subscribe'. You will then also receive
  1126.   several updates before the next version is released.
  1127.  
  1128. Please, be aware that it may take a couple of days before the new version
  1129. is available at all these locations. It is available immediatly by using
  1130. the mail archive server.
  1131.  
  1132. Beside a large number of new and changed selectors, these are the major
  1133. changes since the previous version:
  1134.  
  1135. ***************************************************************************
  1136. Added selectors
  1137.   Apple System  : -
  1138.   Apple Add.    : fsm , srta, srtb, ws 1
  1139.   Third Parties : CsWT, FPUE, PPP
  1140. Added unknown
  1141.   Apple Softw.  : diag, jkbd, lang, mtem, ot
  1142.   Third Parties : *DC*, AlaC, Blad, Cafe, FW14, Mgc!, SNIT, SPAL, SPLO
  1143. Changed selectors
  1144.   Apple System  : a/ux, afps, cfrg, csvr, ctbv, cpnt, dplv, dply, easy,
  1145.                   fndr, fs  , gval, hdwr, help, hscd, icon, intd, kbd ,
  1146.                   mach, mbox, proc, qd  , qdrw, sdev, sdvr, snhw, sysv,
  1147.                   vm  , xlat
  1148.   Apple Add.    : cmta, cmtc, gfxa, grfx, ttsc
  1149.   Third Parties : jsm1, SAVR
  1150. Changed unknown
  1151.   Apple Softw.  : aslm, batt, bugx, bugy, dude, dudi, fnda, fnd*, fndc,
  1152.                   port
  1153.   Third Parties : FWCP, ReSp
  1154. Previously unknown
  1155.   Apple System  : scsi
  1156.   Apple Add.    : -
  1157.   Third Parties : Cafe
  1158. Includes updates 2.5.1 up to and including 2.5.10, sent to subscribers of
  1159. the mailing list.
  1160.  
  1161. The new Inside Macintosh Operating System Utilities is available (at least
  1162. electronically) and a few pieces of information in the GSL are corrected or
  1163. added. I see no reason to change the basics for the GSL, new selectors and
  1164. attribute bits will keep appearing as the system software develops...
  1165.  
  1166. The note about the gestaltKeyboardType selector not being installed on
  1167. the PowerMac 7100/66 was triggered by an Usenet posting by Marc Cooperman.
  1168. His observation was confirmed by me because Gestalt! reports of the
  1169. PM 7100/66 indeed do not list this selector, but I never noticed this when
  1170. I received these reports! Other (Power)Macs don't seem to have this
  1171. problem.
  1172.  
  1173. The GSL has been made available by Robert Lentz on a World Wide Web server.
  1174. It now has the latest version and a reference to it is included with the
  1175. 'About This List/Availability' section.
  1176.  
  1177. Included information from the:
  1178.  - Bookmark CD #18,
  1179.  - Bookmark CD #19,
  1180.  - WWDC 1994 CD,
  1181.  - Developer CD Series August 1994 Tool Chest CD and
  1182.  - Developer CD Series September 1994 Reference Library CD.
  1183.  
  1184. Roland Mansson provided the information from the latest Gestalt &
  1185. SysEnvirons TechNote (rev. September 1994). The most important news
  1186. is that the machine ID's will be reused...
  1187.  
  1188. The following selectors are now installed with software included with
  1189. System 7.5 and are moved from the 'Apple Additional Software' to the 'Apple
  1190. System Software' section:
  1191.       ascr, ascv, aucd, cpkr,
  1192.       drag, hscd, icmp, iscd,
  1193.       kpcd, mtcp, qtim, qtrs,
  1194.       scra, sdev, sdvr, snhw,
  1195.       teat, thds, ufox, xlat
  1196. And these from the unknown 'Third Party Software' to the unknown 'Apple
  1197. Software' section:
  1198.       CDJR, HAM , MClk
  1199. ***************************************************************************
  1200.  
  1201.  
  1202. Best regards,
  1203. Rene Ros
  1204. rgaros@bio.vu.nl
  1205.  
  1206. -- 
  1207.   Rene G.A. Ros           rgaros@bio.vu.nl          Amsterdam, The Netherlands
  1208. - ------------------------------------------------------------------------------
  1209.   English is deliberately designed to frustrate foreigners, you know...
  1210.   (Jeremy Roussak (UK) while trying to explain 'an/a' to me)
  1211.  
  1212. ---------------------------
  1213.  
  1214. >From danmcd@sundance.itd.nrl.navy.mil (Dan McDonald)
  1215. Subject: Global storage in code resources
  1216. Date: 14 Oct 1994 17:13:29 GMT
  1217. Organization: Information Technology Division, Naval Research Laboratory
  1218.  
  1219.  
  1220. With the advent of PowerPC, I'm again confused on something I thought I
  1221. knew.
  1222.  
  1223. I assumed that:
  1224.  
  1225.     * Global variables between procedures in a separate code resource
  1226.       were okay, as long as A4 was set up properly
  1227.  
  1228. If that assumption was wrong, fine.  If it's right, then
  1229.  
  1230.     * How the HELL do you set up A4 in PowerPC code resources?
  1231.  
  1232. I may end up designing my external code modules such that the module asks
  1233. the main program for storage, and the main program delivers, and
  1234. subsequently sends pointers to it whenever the code in the module is called.
  1235.  
  1236. Any comments, hints, death threats, etc. are vastly appreciated.
  1237. -- 
  1238. Daniel L. McDonald | Mail:  danmcd@itd.nrl.navy.mil -------------------------+
  1239. Computer Scientist | WWW:   http://wintermute.itd.nrl.navy.mil/danmcd.html   |
  1240. Naval Research Lab | Phone: (202) 404-7122        #include <disclaimer.h>    |
  1241. Washington, DC     | "Rise from the ashes, A blaze of everyday glory" - Rush +
  1242.  
  1243. +++++++++++++++++++++++++++
  1244.  
  1245. >From isis@netcom.com (Mike Cohen)
  1246. Date: Sat, 15 Oct 1994 19:09:29 GMT
  1247. Organization: ISIS International
  1248.  
  1249. In article <37me7q$b40@ra.nrl.navy.mil>, danmcd@sundance.itd.nrl.navy.mil
  1250. (Dan McDonald) wrote:
  1251.  
  1252. > With the advent of PowerPC, I'm again confused on something I thought I
  1253. > knew.
  1254. > I assumed that:
  1255. >         * Global variables between procedures in a separate code resource
  1256. >           were okay, as long as A4 was set up properly
  1257. > If that assumption was wrong, fine.  If it's right, then
  1258. >         * How the HELL do you set up A4 in PowerPC code resources?
  1259. 68K code resources still need to have A4 set up, but you don't have to do
  1260. anything in native code resources. In PPC code, every code fragment
  1261. (including code resources) has its own global space accessible thru the
  1262. RTOC, which a register is always pointing to when that code fragment is
  1263. executing.
  1264.  
  1265. -- 
  1266. Mike Cohen - isis@netcom.com
  1267. NewtonMail, eWorld: MikeC / ALink: D6734 / AOL: MikeC20
  1268. Home Page: ftp://ftp.netcom.com/pub/isis/home.html
  1269.  
  1270. ---------------------------
  1271.  
  1272. >From zack@netcom.com (Zack T. Smith)
  1273. Subject: How to execute MPW tools without MPW
  1274. Date: Wed, 12 Oct 1994 13:58:39 GMT
  1275. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1276.  
  1277. Hi,
  1278.  
  1279. I'd like to find out how I can execute MPW commands without
  1280. having MPW. I know that there is a program available for
  1281. doing this (toolserver), but I don't want to use it.
  1282.  
  1283. I notice that the MPW tool that I have (gcc) contains only code 
  1284. and version resources. I've tried to execute that as a 
  1285. standalone app by changing creator to FNDR and type to APPL, 
  1286. but the program immediately exits.
  1287.  
  1288. Does anyone know why this might be happening, assuming that gcc
  1289. is not buggy. I've tried to inquire with Apple via email, but 
  1290. they won't respond. My guess is that, if gcc had been
  1291. executing properly, it simply didn't find any params to work on,
  1292. so it exited. 
  1293.  
  1294. Would anyone know whether it's necessary to load MPW tools 
  1295. into memory in order to execute them and pass parameters?
  1296.  
  1297. Thanks for any info,
  1298.  
  1299. Zack Smith
  1300.  
  1301.  
  1302. +++++++++++++++++++++++++++
  1303.  
  1304. >From shebs@cygnus.com (Stan Shebs)
  1305. Date: Wed, 12 Oct 1994 18:52:22 GMT
  1306. Organization: /cygint/s1/users/shebs/.organization
  1307.  
  1308.  
  1309. In article <zackCxKC5s.Jnx@netcom.com> zack@netcom.com (Zack T. Smith) writes:
  1310.  
  1311.    I notice that the MPW tool that I have (gcc) contains only code 
  1312.    and version resources. I've tried to execute that as a 
  1313.    standalone app by changing creator to FNDR and type to APPL, 
  1314.    but the program immediately exits.
  1315.  
  1316. Uh, MPW GCC requires considerable MPW infrastructure - for one thing,
  1317. it is a collection of tools, for another, it expects to be able to use
  1318. the MPW Assembler.  And where do you plan to get include files and
  1319. libraries?  Changing the file type to get it to run is about like
  1320. working the shift lever on an engineless car - it *might* start
  1321. rolling if you happen to shift into neutral while on a downhill slope...
  1322.  
  1323. MPW GCC needs a full MPW environment in order to be used.  Jonathan
  1324. Kimmitt has hacked up a standalone version, but it has a number of
  1325. limitations (the last time I looked, it couldn't build itself, for
  1326. instance).
  1327.  
  1328.    Does anyone know why this might be happening, assuming that gcc
  1329.    is not buggy. I've tried to inquire with Apple via email, but 
  1330.    they won't respond. My guess is that, if gcc had been
  1331.    executing properly, it simply didn't find any params to work on,
  1332.    so it exited. 
  1333.  
  1334. It's not that "Apple won't respond", it's that there's nobody there
  1335. *to* respond.  MPW GCC is not an Apple product, it was a project I
  1336. did while in Apple's ATG (and as you might guess from the address below,
  1337. I'm no longer there).  If you use it with MPW, it works just fine.
  1338.  
  1339. (For those more knowledgeable who might be wondering, yes Cygnus
  1340. would be willing to do an updated Mac GCC, *if* appropriate funding
  1341. were to be provided - I have no spare time these days :-( )
  1342.  
  1343.                             Stan Shebs
  1344.                             Cygnus Support
  1345.                             shebs@cygnus.com
  1346.  
  1347. +++++++++++++++++++++++++++
  1348.  
  1349. >From jwbaxter@olympus.net (John W. Baxter)
  1350. Date: Wed, 12 Oct 1994 09:52:59 -0700
  1351. Organization: Internet for the Olympic Peninsula
  1352.  
  1353. In article <zackCxKC5s.Jnx@netcom.com>, zack@netcom.com (Zack T. Smith) wrote:
  1354.  
  1355. > Hi,
  1356. > I'd like to find out how I can execute MPW commands without
  1357. > having MPW. I know that there is a program available for
  1358. > doing this (toolserver), but I don't want to use it.
  1359. > I notice that the MPW tool that I have (gcc) contains only code 
  1360. > and version resources. I've tried to execute that as a 
  1361. > standalone app by changing creator to FNDR and type to APPL, 
  1362. > but the program immediately exits.
  1363.  
  1364. MPW (and ToolServer) provides a considerable amount of environment in
  1365. which MPW tools operate.  (Including in MPW's case a "foreign file system"
  1366. so that the tool access the current content of a window being edited, when
  1367. it thinks it is opening a file by that name.)
  1368.  
  1369. What you want to do is not impossible (witness Think/Symantec's SARez and
  1370. SADerez, which are apps which provide the needed environment), but more
  1371. trouble than it's worth.
  1372.  
  1373.    --John
  1374.  
  1375. -- 
  1376. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1377.    Sorry...clever signatures require cleverness, not found here.
  1378.    jwbaxter@pt.olympus.net
  1379.  
  1380. +++++++++++++++++++++++++++
  1381.  
  1382. >From zack@netcom.com (Zack T. Smith)
  1383. Date: Fri, 14 Oct 1994 23:48:09 GMT
  1384. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1385.  
  1386. In article <SHEBS.94Oct12105222@andros.cygnus.com> shebs@cygnus.com (Stan Shebs) writes:
  1387. >
  1388. >In article <zackCxKC5s.Jnx@netcom.com> zack@netcom.com (Zack T. Smith) writes:
  1389. >
  1390. >   I notice that the MPW tool that I have (gcc) contains only code 
  1391. >   and version resources. I've tried to execute that as a 
  1392. >   standalone app by changing creator to FNDR and type to APPL, 
  1393. >   but the program immediately exits.
  1394. >
  1395. >Uh, MPW GCC requires considerable MPW infrastructure - for one thing,
  1396. >it is a collection of tools, for another, it expects to be able to use
  1397. >the MPW Assembler.  And where do you plan to get include files and
  1398. >libraries?  Changing the file type to get it to run is about like
  1399. >working the shift lever on an engineless car - it *might* start
  1400. >rolling if you happen to shift into neutral while on a downhill slope...
  1401.  
  1402. Libs and header files are available from ftp.apple.com.
  1403.  
  1404. MPW asm can be replaced with GNU asm (gas).
  1405.  
  1406. Much of the "infrastructure" would be provided through my C Shell,
  1407. assuming you mean environment variables, scripting, access to other
  1408. tools.
  1409.  
  1410. >MPW GCC needs a full MPW environment in order to be used.  Jonathan
  1411. >Kimmitt has hacked up a standalone version, but it has a number of
  1412. >limitations (the last time I looked, it couldn't build itself, for
  1413. >instance).
  1414.  
  1415. Has anyone got Kimmit's email address?
  1416.  
  1417. >   Does anyone know why this might be happening, assuming that gcc
  1418. >   is not buggy. I've tried to inquire with Apple via email, but 
  1419. >   they won't respond. My guess is that, if gcc had been
  1420. >   executing properly, it simply didn't find any params to work on,
  1421. >   so it exited. 
  1422. >
  1423. >It's not that "Apple won't respond", it's that there's nobody there
  1424. >*to* respond.  MPW GCC is not an Apple product, it was a project I
  1425. >did while in Apple's ATG (and as you might guess from the address below,
  1426. >I'm no longer there).  If you use it with MPW, it works just fine.
  1427. >
  1428. >(For those more knowledgeable who might be wondering, yes Cygnus
  1429. >would be willing to do an updated Mac GCC, *if* appropriate funding
  1430. >were to be provided - I have no spare time these days :-( )
  1431. >
  1432. >                            Stan Shebs
  1433. >                            Cygnus Support
  1434. >                            shebs@cygnus.com
  1435.  
  1436. Zack Smith
  1437.  
  1438. +++++++++++++++++++++++++++
  1439.  
  1440. >From khatt@shell.portal.com (Judy Ann Kettenhofen)
  1441. Date: 23 Oct 1994 09:04:32 GMT
  1442. Organization: Portal Communications Company -- 408/973-9111 (voice) 408/973-8091 (data)
  1443.  
  1444. Zack T. Smith (zack@netcom.com) wrote:
  1445. : In article <SHEBS.94Oct12105222@andros.cygnus.com> shebs@cygnus.com (Stan Shebs) writes:
  1446. : >
  1447. : >In article <zackCxKC5s.Jnx@netcom.com> zack@netcom.com (Zack T. Smith) writes:
  1448. : >
  1449. : >   I notice that the MPW tool that I have (gcc) contains only code 
  1450. : >   and version resources. I've tried to execute that as a 
  1451. : >   standalone app by changing creator to FNDR and type to APPL, 
  1452. : >   but the program immediately exits.
  1453. : >
  1454. : >Uh, MPW GCC requires considerable MPW infrastructure - for one thing,
  1455. : >it is a collection of tools, for another, it expects to be able to use
  1456. : >the MPW Assembler.  And where do you plan to get include files and
  1457. : >libraries?  Changing the file type to get it to run is about like
  1458. : >working the shift lever on an engineless car - it *might* start
  1459. : >rolling if you happen to shift into neutral while on a downhill slope...
  1460.  
  1461. : Libs and header files are available from ftp.apple.com.
  1462.  
  1463. : MPW asm can be replaced with GNU asm (gas).
  1464.  
  1465. : Much of the "infrastructure" would be provided through my C Shell,
  1466. : assuming you mean environment variables, scripting, access to other
  1467. : tools.
  1468.  
  1469. You just aren't going to be able to run an MPW tool as an app, at
  1470. least very easily.  I suspect it is more trouble than it is worth.
  1471.  
  1472. An MPW tool has some curious code that is executed in the runtime.o
  1473. library.  This code basically hooks up the tools' input/output to
  1474. the Shell's.  You can think of it as almost like a dynamically-linked
  1475. library.  To give you some idea of which routines, do a dumpobj of
  1476. stubs.o, a library generally included when making tools; you'll notice
  1477. that most of these routines are simply empty routines.  They are there
  1478. to make the linker happy; they aren't used other than for that.
  1479.  
  1480. Stubs.o, plus other mechanisms, are used by tools running under the
  1481. Shell to provide the ability, as someone has pointed out, to deal
  1482. with the contents of open (and unsaved) windows.
  1483.  
  1484.  IF you could talk Apple out of telling you *exactly* how
  1485. this works, you might be able to build something around the tool to
  1486. provide those services; but the tool, in and of itself does not
  1487. contain those services.  (Altho', if I recall correctly, someone
  1488. within Apple once made one of the MPW tools so that it was able to
  1489. determine whether it was running as a tool or as an app and do the
  1490. appropriate thing.).
  1491.  
  1492. ==Judy
  1493.  
  1494. --former MPW/ToolServer/Asm Hack.
  1495.  
  1496. ---------------------------
  1497.  
  1498. >From Jon Lipsky <jml16@po.cwru.edu>
  1499. Subject: MacTCP Completion Routines & Async Nofification
  1500. Date: 18 Oct 1994 20:45:22 GMT
  1501. Organization: Case Western Reserve University
  1502.  
  1503. I am having trouble getting async connections working with
  1504. my TCP library I am working on.  I had no problems getting
  1505. syncronous connection to work.
  1506.  
  1507. I was wondering if there were bugs in the TCP header files
  1508. with the Completion Rountine, and Async Notification Routine
  1509. prototypes.  If anyone could help me out, I would appreciate
  1510. it.
  1511.  
  1512. Thanks in advance,
  1513.  
  1514. Jon...
  1515.  
  1516. +++++++++++++++++++++++++++
  1517.  
  1518. >From Aaron Wohl <aw0g+@andrew.cmu.edu>
  1519. Date: Wed, 19 Oct 1994 08:01:07 -0400
  1520. Organization: Systems Group 97, Carnegie Mellon, Pittsburgh, PA
  1521.  
  1522. Excerpts from netnews.comp.sys.mac.programmer: 18-Oct-94 MacTCP
  1523. Completion Routines .. Jon Lipsky@po.cwru.edu (363)
  1524.  
  1525. > I was wondering if there were bugs in the TCP header files
  1526. > with the Completion Rountine, and Async Notification Routine
  1527. > prototypes.  If anyone could help me out, I would appreciate
  1528. > it.
  1529.  
  1530.  
  1531. No none that I know of.   However, the compleation routine is called
  1532. from interrupt level.  If you haven't done this sort of thing before it
  1533. is almost impossible to get it right.    The key items are:
  1534.  
  1535. - be carefull of the registers, like A5 isn't setup so you can't access
  1536. any globals
  1537. - some compilers generate functionc calls off of A5 so you may not be able
  1538. to call anything before A5 is setup.
  1539. - You can't call hardly any of the mac OS system calls.
  1540.  
  1541. For debugging such code take a look on host akutaktak.andrew.cmu.edu
  1542. [128.2.35.1] in /aw0g/softkiss*.*.   There is a debugging printf that
  1543. can be called from hardware interrupt level.  It writes directly to the
  1544. screen memory so you can even call it from a VBL, inside a trap patch
  1545. etc.
  1546.  
  1547. A sample async notification routine:
  1548.  
  1549. /*
  1550.  * handle incomming data or connection drop
  1551.  */
  1552. static pascal void myTCPNotifyProc(StreamPtr tcpStream,
  1553.     unsigned short eventCode,
  1554.     Ptr userDataPtr,
  1555.     unsigned short terminReason,
  1556.     struct ICMPReport *icmpMsg)
  1557. {
  1558.     register tcp_conv_pt acnv=(tcp_conv_pt)userDataPtr;
  1559.  
  1560.     acnv->last_event=eventCode;
  1561.     acnv->service_me=TRUE;
  1562.  
  1563.     switch (eventCode) {
  1564.         case TCPTerminate:
  1565.             acnv->terminating++;
  1566.             break;
  1567.         case TCPClosing:
  1568.             acnv->closing++;
  1569.             break;
  1570.         case TCPULPTimeout:
  1571.             break;
  1572.         case TCPDataArrival:
  1573.             acnv->data_arrived++;
  1574.             break;
  1575.         case TCPUrgent:
  1576.             break;
  1577.         case TCPICMPReceived:
  1578.             break;
  1579.         default:    
  1580.             break;
  1581.         }
  1582. }
  1583.  
  1584. Async compleation routines should similarly be kept very simple.
  1585. Aaron Wohl / ham callsign N3LIW / 412-731-3691 / 412-268-5032
  1586.  
  1587. ---------------------------
  1588.  
  1589. >From jbeeghly@u.washington.edu (Jeff Beeghly)
  1590. Subject: Memory Management within the Real World
  1591. Date: 17 Oct 1994 06:11:53 GMT
  1592. Organization: University of Washington
  1593.  
  1594. Well, the app which I am writing is up to the fully functioning stage, so 
  1595. now I have to tackle those neat real world scenarios .... like gracefully 
  1596. handling error conditions, running under low memory scenarios, etc...   
  1597. and I have several questions on issues which have come up recently.
  1598.  
  1599. 1) Under a low memory condition (~6,000 to 7,000 bytes free) calling the 
  1600. StandardGetFile toolbox call crashes my app.  When I ran my app under the 
  1601. debugger (THINK C ver 6.0) and called my function, my machine locked up 
  1602. (my app didn't even break to the THINK C debugger).  I've tried to narrow 
  1603. down the conditions (for example, in my app I was originally using a 
  1604. custom file open dialog box), but right now I am just using 
  1605. StandardGetFile(0L, -1, 0L, &reply), and when I call this function (e.g. 
  1606. when I select the menu item that calls this function), I'm not calling 
  1607. anything else, so I'm VERY CONFIDENT that it is the system call that is 
  1608. crashing, not something that I have done (I've been working as a 
  1609. professional software tester for several years now.. believe me, I know 
  1610. how to isolate a bug    ;-)  ).
  1611.  
  1612. Is this a known fact?  Does StandardGetFile crash under low memory 
  1613. conditions?  Do I have to do something like the following, just to ensure 
  1614. that my app doesn't crash?
  1615.  
  1616. if(FreeMem() >7000L)
  1617. {
  1618.     StandardGetFile(0L, -1, 0L, &reply);
  1619. }
  1620. else
  1621. {
  1622.     //flash an alert and warn the user
  1623. }
  1624.  
  1625.  
  1626. 2) In one of my dialogs, I am loading four separate pictures (only one 
  1627. picture is displayed at a time) and displaying them to create an 
  1628. 'animation' effect within the dialog (OK.  yes.  it is my about dialog 
  1629. box).  I'm doing something like the following:
  1630.  
  1631. while( !dlgDone )
  1632. {
  1633.     ModalDialog(AboutDlgProc, &dlgItem);
  1634.     dlgDone = (dlgItem == OK_ITEM || dlgItem == CANCEL_ITEM);
  1635. }
  1636.  
  1637. - -----------------------
  1638.  
  1639. pascal Boolean AboutDlgProc(DialogPtr theDialog, EventRecord *e, short *iPtr)
  1640. {
  1641.     static short step = 0;
  1642.  
  1643.     switch( e->what )
  1644.     {
  1645.         case keyDown:
  1646.         case autoKey:
  1647.             .
  1648.             .
  1649.             bla, bla, bla.... the usual
  1650.     }
  1651.  
  1652.     DoAnimation(theDialog, step);
  1653.     step++;
  1654.     if(step >= 4)
  1655.         step = 0;
  1656. }
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662. void DoAnimation(DialogPtr theDialog, short step)
  1663. {
  1664.     PicHandle    pic;
  1665.     Rect        r;
  1666.  
  1667.  
  1668.     switch( step )
  1669.     {
  1670.         case 0:
  1671.             pic = GetPicture(128);
  1672.             break;
  1673.  
  1674.         case 1:
  1675.             pic = GetPicture(129);
  1676.             break;
  1677.  
  1678.         case 2:
  1679.             pic = GetPicture(130);
  1680.             break;
  1681.  
  1682.         case 3:
  1683.             pic = GetPicture(131);
  1684.             break;
  1685.     }
  1686.  
  1687.  
  1688.     if(pic != nil)
  1689.     {
  1690.         HLock( (Handle )pic );
  1691.         SetRect(&r, 20, 40, 20 + 124, 40 + 60);
  1692.         DrawPicture(pic, &r);
  1693.         HUnlock( (Handle )pic);
  1694.     }
  1695. }
  1696.  
  1697. Looks good so far, no?
  1698. Well, the problem is that under a low memory condition (say ~7,000 - 
  1699. 8,000 bytes free), the first picture is loaded and displays fine, but 
  1700. when the second image is loaded, my app crashes (BTW:  each picture is 
  1701. 124 x 60 pixels x 256 colors and ResEdit said each were ~ 4500 bytes large).
  1702.  
  1703. I then went in and added a
  1704.     ReleaseResource( (Handle )pic);
  1705. call after the HUnlock call.  This time, each of the four pictures were 
  1706. loaded (and my app didn't crash), but when the counter turned back to 0, the 
  1707. first pic wasn't displayed.
  1708.  
  1709. I dismissed the dialog box and brought it back up again.  This time, none 
  1710. of the pictures were displayed!  Well, this leads me to believe that when 
  1711. I call ReleaseResource(), it not only frees up the memory of the handle 
  1712. holding the picture, but it clears it from the current resource as well.  
  1713. I then tried to use the DisposeHandle() call in place of the 
  1714. ReleaseResource() call, and the same thing occurred (all four pictures 
  1715. were displayed once and only once).
  1716.  
  1717.  
  1718. At this point, I added following:
  1719.  
  1720. if(pic != nil)
  1721. {
  1722.     .
  1723.     .
  1724.     .
  1725. }
  1726. else
  1727. {
  1728.     MoveTo(20, 20);
  1729.     DrawString("\pCan't open image");
  1730. }
  1731.  
  1732.  
  1733. I was thinking, OK, the problem is there is not enough memory to open the 
  1734. image... that is why my app is crashing... I'll just check to see if the 
  1735. PicHandle is nil.  If it is not nil, I will draw the picture.  If it is 
  1736. nil, I will not draw the pic and continue on.
  1737.  
  1738. When I ran my program and brought up the dialog, the error message never 
  1739. came up!
  1740.  
  1741.  
  1742. So what gives?  I can't load and display the image, yet the pic isn't nil 
  1743. either!?!?!  (btw:  I did this for the case of when I try to release 
  1744. memory (via ReleaseResource or DisposeHandle) and when I don't release 
  1745. the Handle).
  1746.  
  1747.  
  1748.  
  1749. Do I need to do a lot of watch dogging and not let any operations be 
  1750. performed if the app goes beneath 0k of memory is free?
  1751.  
  1752.  
  1753. 3) In Macintosh C Programming Primmer Vol 2, it states that when a 
  1754. program starts, it contains a block of master pointers.  It is within 
  1755. this location that the location of the Handles are kept (64 of them).  If 
  1756. the program requires more than 64, the MoreMasters() call needs to be 
  1757. made (which will create 64 more locations for handles).  What happens if 
  1758. I have filled up all 64 locations with handles, then create another 
  1759. handle (for arguments' sake, let's say that there is enough memory to 
  1760. create the size of the handle, and we create a new handle without 
  1761. calling MoreMasters())?  Will I run the risk of loosing the handle when 
  1762. memory is juggled around?
  1763.  
  1764. 4) In my program, I manage multiple files at the same time (hence, my app 
  1765. manages several windows at the same time).  In each file/window, there 
  1766. are LOTS of different handles (my app displays dozens of icon suites, and 
  1767. each icon suite is a handle).  In fact, if I have a window that is maxed 
  1768. out (each window will hold a maximum amount of 50 icon suites), It would 
  1769. seem that I would almost have to call MoreMasters() each time I 
  1770. create/open a new window (when I create/open a new window, I perform a
  1771. NewHandle( sizeof(data_in_my_window) ) type of call in my program).  Is 
  1772. there a call that REMOVES 64 master pointers?  In other words, I was 
  1773. wondering if there is a way to call MoreMasters() before I create/open a 
  1774. window, and call RemoveMastersFunction() after I close a window?  Yes, I 
  1775. could just add another MoreMasters() call at the begining of my program, 
  1776. but I intend to allow the user to have as many windows/files opened as 
  1777. they want.
  1778.  
  1779. 5) Is there a call that forces the system to compact the fragmented 
  1780. memory of an app?  I 
  1781. remember reading that the system automatically compacts the memory at 
  1782. certain intervals, and I know that there are functions that will compact 
  1783. the memory, so there is a certain amount of memory free (e.g.  
  1784. CompactMem( x ), where x is the number of bytes needed), but is there a 
  1785. call that will force the system to compact as much as possible?
  1786.  
  1787.  
  1788. +++++++++++++++++++++++++++
  1789.  
  1790. >From philip@cs.wits.ac.za (Philip Machanick)
  1791. Date: 17 Oct 1994 12:10:17 GMT
  1792. Organization: Computer Science Dept, U of Witwatersrand
  1793.  
  1794. In article <37t4j9$bq4@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  1795. (Jeff Beeghly) wrote:
  1796.  
  1797. >         DoAnimation(theDialog, step);
  1798. >         step++;
  1799. >         if(step >= 4)
  1800. >                 step = 0;
  1801. > }
  1802.  
  1803. Just a minor thing - I'll leave the memory management thing for others -
  1804. but if your PICTs are sequentially numbered, why not use the resource ID
  1805. directly, and savve yourself the switch statement? If they aren't
  1806. guaranteed to be sequential, you could still store them in an array which
  1807. would be easier to update than adding another case in the switch.
  1808.  
  1809. > void DoAnimation(DialogPtr theDialog, short step)
  1810. > {
  1811. >         PicHandle       pic;
  1812. >         Rect            r;
  1813. >  
  1814. >  
  1815. >         switch( step )
  1816. >         {
  1817. >                 case 0:
  1818. >                         pic = GetPicture(128);
  1819. >                         break;
  1820. >  
  1821. >                 case 1:
  1822. >                         pic = GetPicture(129);
  1823. >                         break;
  1824.  
  1825. etc.
  1826. -- 
  1827. Philip Machanick                   philip@cs.wits.ac.za
  1828. Department of Computer Science, University of the Witwatersrand
  1829. 2050 Wits, South Africa        (at University of Cape Town 4 July-7 Nov)
  1830. phone 27(11)716-3309  fax 27(11)339-7965
  1831.  
  1832. +++++++++++++++++++++++++++
  1833.  
  1834. >From mhl@icf.hrb.com (MARK H. LINTON)
  1835. Date: 17 Oct 94 13:44:22 EST
  1836. Organization: HRB Systems, Inc.
  1837.  
  1838. In article <37t4j9$bq4@nntp1.u.washington.edu>, jbeeghly@u.washington.edu (Jeff Beeghly) writes:
  1839. >  
  1840. > 1) ... Does StandardGetFile crash under low memory conditions?  
  1841. >
  1842.  
  1843.         Sorry, don't know for sure, but I wouldn't be too
  1844.         surprised.
  1845.  
  1846. >  
  1847. > 2) I am loading four separate pictures...
  1848. >  
  1849.  
  1850. void DoAnimation(short step) {
  1851.     PicHandle    pic = GetPicture(128+step);
  1852.      
  1853.     if (pic != nil) DrawPicture(pic, &(**pic).portRect);
  1854. }
  1855.  
  1856. >  
  1857. > Looks good so far, no?
  1858.  
  1859.         Well, no. I would guess this flashes like mad (but if you
  1860.         haven't gotten it to work yet, you wouldn't know that ;^).
  1861.         I would probably load the resources once, image them into
  1862.         offscreen graphics worlds and then just CopyBits in
  1863.         DoAnimation. Lots of sample code available to do this BTW.
  1864.  
  1865. > Well, the problem is that under a low memory condition (say ~7,000 - 
  1866. > 8,000 bytes free), the first picture is loaded and displays fine, but 
  1867. > when the second image is loaded, my app crashes...
  1868.  
  1869.         How do you know how much memory you have free?
  1870.  
  1871. >  
  1872. > I then went in and added a
  1873. >     ReleaseResource( (Handle )pic);
  1874. > This time, each of the four pictures were loaded (and my app didn't crash)
  1875.  
  1876.         This should be a clue... (what has changed? why did that
  1877.         make a difference?... are your PICT resources marked
  1878.         purgeable?)
  1879.  
  1880. > ...but when the counter turned back to 0, the first pic wasn't displayed.
  1881. >  
  1882. > I dismissed the dialog box and brought it back up again.  This time, none 
  1883. > of the pictures were displayed!  Well, this leads me to believe that when 
  1884. > I call ReleaseResource(), it not only frees up the memory of the handle 
  1885. > holding the picture, but it clears it from the current resource as well.  
  1886. > I then tried to use the DisposeHandle() call in place of the 
  1887. > ReleaseResource() call, and the same thing occurred (all four pictures 
  1888. > were displayed once and only once).
  1889. >  
  1890. > At this point, I added following:
  1891. >  
  1892.  if (pic != nil) {
  1893.        ...
  1894.  } else {
  1895. >     MoveTo(20, 20);
  1896. >     DrawString("\pCan't open image");
  1897. > }
  1898. >  
  1899. > the error message never came up!
  1900. >  
  1901. > So what gives?  I can't load and display the image, yet the pic isn't nil 
  1902. > either!?!?!  
  1903. >  
  1904.  
  1905.         There were three statements in that last line.
  1906.  
  1907.         1) I can't load the image
  1908.         2) I can't display the image
  1909.         3) The handle to the image is not nil
  1910.  
  1911.         These can not all be true. GetPicture returns nil if it
  1912.         was unable to load the image. Since you say "the error
  1913.         message never came up" I will assume that 3 is true. This
  1914.         means that 1 must be false. This leaves only 2 as a
  1915.         problem for your application. This is what you must
  1916.         investigate.
  1917.  
  1918.         BTW, have you investigated how QuickDraw reports errors.
  1919.         Given that it appears that this "feature" is occurring in
  1920.         the DrawPicture call, how would you know that it failed?
  1921.         Apart from not being able to see the picture.
  1922.  
  1923. > Do I need to do a lot of watch dogging and not let any operations be 
  1924. > performed if the app goes beneath 0k of memory is free?
  1925. >  
  1926.  
  1927.         You have less than 0k of memory free and expect the
  1928.         program to do something?
  1929.  
  1930.         BTW, just to be a total smart-***, the generally accepted
  1931.         way to handle this type of situation is to:
  1932.  
  1933.         1) Figure out how much memory you application needs.
  1934.         2) Make sure that it gets at least that much.
  1935.  
  1936.         ;^) <--- note the smiley!
  1937.  
  1938. >  
  1939. > 3) In Macintosh C Programming Primmer Vol 2, it states that when a 
  1940. > program starts, it contains a block of master pointers.  It is within 
  1941. > this location that the location of the Handles are kept (64 of them).  If 
  1942. > the program requires more than 64, the MoreMasters() call needs to be 
  1943. > made (which will create 64 more locations for handles).  What happens if 
  1944. > I have filled up all 64 locations with handles, then create another 
  1945. > handle (for arguments' sake, let's say that there is enough memory to 
  1946. > create the size of the handle, and we create a new handle without 
  1947. > calling MoreMasters())?  Will I run the risk of loosing the handle when 
  1948. > memory is juggled around?
  1949. >  
  1950.  
  1951.         If you call NewHandle, and you have no more master
  1952.         pointers available, NewHandle will call MoreMasters for
  1953.         you. The point behind doing it youself is that master
  1954.         pointer blocks are non-relocatable and tend to lead to
  1955.         heap fragmentation. 
  1956.  
  1957.         If you let NewHandle make the call, the master pointer
  1958.         block will be placed as low in the heap as possible.
  1959.         Depending on what you have been doing, you may have
  1960.         relocatable or purgeable structures in heap below that
  1961.         block. If you want to reuse that memory, especially with
  1962.         something that may be larger than the things that
  1963.         previously occupied that space (as seems like you may) you
  1964.         are unable to because you have a master pointer block
  1965.         sitting where you need to put your new structure.
  1966.  
  1967.         Go ahead and call MoreMasters two, three... maybe ten
  1968.         times early in your program. Master pointer blocks are
  1969.         pretty small compared to the space you could loose letting
  1970.         NewHandle do it for you.
  1971.  
  1972. > 4) In my program, I manage multiple files at the same time (hence, my app 
  1973. > manages several windows at the same time).  In each file/window, there 
  1974. > are LOTS of different handles (my app displays dozens of icon suites, and 
  1975. > each icon suite is a handle).  In fact, if I have a window that is maxed 
  1976. > out (each window will hold a maximum amount of 50 icon suites), It would 
  1977. > seem that I would almost have to call MoreMasters() each time I 
  1978. > create/open a new window (when I create/open a new window, I perform a
  1979. > NewHandle( sizeof(data_in_my_window) ) type of call in my program).  
  1980. >
  1981.  
  1982.         that would be a BadThing(r), see above.
  1983.  
  1984. >
  1985. > Is 
  1986. > there a call that REMOVES 64 master pointers?  In other words, I was 
  1987. > wondering if there is a way to call MoreMasters() before I create/open a 
  1988. > window, and call RemoveMastersFunction() after I close a window?  Yes, I 
  1989. > could just add another MoreMasters() call at the begining of my program, 
  1990. > but I intend to allow the user to have as many windows/files opened as 
  1991. > they want.
  1992. >  
  1993.  
  1994.         no, again, see above
  1995.  
  1996. > 5) Is there a call that forces the system to compact the fragmented 
  1997. > memory of an app?  I 
  1998. > remember reading that the system automatically compacts the memory at 
  1999. > certain intervals, and I know that there are functions that will compact 
  2000. > the memory, so there is a certain amount of memory free (e.g.  
  2001. > CompactMem( x ), where x is the number of bytes needed), but is there a 
  2002. > call that will force the system to compact as much as possible?
  2003.  
  2004.         The memory manager has a number of calls in addition to
  2005.         CompactMem (FreeMem and PurgeMem come to mind) but these
  2006.         only help with relocatable and purgeable objects. If your
  2007.         memory is fragmented, it will stay fragmented, these calls
  2008.         only help you use the memory that you have left.
  2009.  
  2010.         From your literary reference above (an excellent starting
  2011.         point, I might add) I assume that you are (fairly) new to
  2012.         Macintosh programming, although from the apparent
  2013.         complexity of your application not to programming in
  2014.         general. Rather than answer you questions with answers, I
  2015.         will answer them with questions and refer you to further
  2016.         reading, so that you can learn the material yourself and
  2017.         not have to ask again next time.
  2018.  
  2019.         (new) Inside Macintosh: Memory - for references to
  2020.         questions about: MoreMasters, NewHandle, CompactMem,
  2021.         PurgeMem, FreeMem, etc.
  2022.  
  2023.         (new) Inside Macintosh: Imaging with QuickDraw - for
  2024.         references to questions about: DrawPicture, GetPicture,
  2025.         etc.
  2026.  
  2027. -- 
  2028. Hope this helps.
  2029.  
  2030. Mark H. Linton
  2031. ____________________________________________________________________
  2032. mark \'märk\ n [ME, fr. OE mearc boundary, march, sign; akin to OHG
  2033. marha boundary, L margo] 1 a : a conspicuous object serving as a guide
  2034. for travelers 2 : A standard or criterion of quality 3 : An object or
  2035. point that serves as a guide --idiom. mark time. 1 : To make little or
  2036. no progress
  2037.  
  2038. +++++++++++++++++++++++++++
  2039.  
  2040. >From jbeeghly@u.washington.edu (Jeff Beeghly)
  2041. Date: 18 Oct 1994 17:00:33 GMT
  2042. Organization: University of Washington
  2043.  
  2044. mhl@icf.hrb.com (MARK H. LINTON) writes:
  2045.  
  2046. >In article <37t4j9$bq4@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  2047. (Jeff Beeghly) writes:
  2048. >> 1) ... Does StandardGetFile crash under low memory conditions?
  2049. >        Sorry, don't know for sure, but I wouldn't be too
  2050. >        surprised.
  2051.  
  2052. I've received one reply that stated all standard system calls will most
  2053. likely crash when memory gets too low.  Therefore, in my app, if the
  2054. memory gets below 10k or 12k, I am going to inform the user that there is
  2055. not enough, and that they should close a file.
  2056.  
  2057.  
  2058. >>
  2059. >> 2) I am loading four separate pictures...
  2060. >>
  2061. >void DoAnimation(short step) {
  2062. >    PicHandle    pic = GetPicture(128+step);
  2063. >    if (pic != nil) DrawPicture(pic, &(**pic).portRect);
  2064. >}
  2065.  
  2066. >>
  2067. >> Looks good so far, no?
  2068.  
  2069. >        Well, no. I would guess this flashes like mad (but if you
  2070. >        haven't gotten it to work yet, you wouldn't know that ;^).
  2071. >        I would probably load the resources once, image them into
  2072. >        offscreen graphics worlds and then just CopyBits in
  2073. >        DoAnimation. Lots of sample code available to do this BTW.
  2074.  
  2075. Well, I guess you missed my point.  Yes, the function works
  2076. fine (if there is enough memory available).  For right now, I'm not
  2077. calling my animation at a set interval, so YES, obviously on faster CPUs it
  2078. will be 'FLASHED'.  Yes, I'm am going to put in a timer, so the interval is
  2079. standard from one machine to another.
  2080.  
  2081. I do know how to use CopyBits and off screen GWorlds.  For this portion
  2082. of the code, it is redundant.  Why?  I don't want to permanently 'hold'
  2083. the pictures... all I need is one picture drawn to the screen at a time
  2084. (therefore, I don't feel I need to hold all four).  Holding the bits in
  2085. an offscreen gworld would mean I am using twice the memory for the images:
  2086. one for the resource and one for the offscreen memory
  2087.  
  2088.  
  2089. >> Well, the problem is that under a low memory condition (say ~7,000 -
  2090. >> 8,000 bytes free), the first picture is loaded and displays fine, but
  2091. >> when the second image is loaded, my app crashes...
  2092.  
  2093. >        How do you know how much memory you have free?
  2094.  
  2095. There is a call called FreeMem() which I am using to output the free
  2096. memory.  I am also using a utility called SWATCH (System Watch) which
  2097. graphically & numerically displays the amount of locked used memory,
  2098. moveable used memory, and free memory each app is using.
  2099.  
  2100.  
  2101. >>
  2102. >> I then went in and added a
  2103. >>      ReleaseResource( (Handle )pic);
  2104. >> This time, each of the four pictures were loaded (and my app didn't crash)
  2105.  
  2106. >        This should be a clue... (what has changed? why did that
  2107. >        make a difference?... are your PICT resources marked
  2108. >        purgeable?)
  2109.  
  2110. Yes, it was a clue.  It was telling me that not only the handle was being
  2111. released, but the location of the resource was being released as well.
  2112. That is why I was only able to display each image once (and only once).
  2113. No, I was not marking the pictures within the resource as being
  2114. purgeable, but I am now doing HPurge( (Handle pic ) after the
  2115. DrawPicture call... it works..... better, but it still crashes (better in
  2116. the sence that if I set my app to run with ~ 12k free and call my dialog
  2117. it works, but if memory gets below 6k, it crashes... looks like I will
  2118. definately have to work on this a bit.
  2119.  
  2120. The point I was trying to make was this:
  2121.  
  2122. If I perform a DisposeHandle on a pic handle, how come I am not able to
  2123. load and display the picture a second time?  DisposeHandle should just
  2124. remove the handle, not the resouce, shouldn't it?
  2125.  
  2126. The other point I was trying to make was this:  If I can get the image
  2127. (and pic != nil), how come I am not able to display it?  If GetPicture
  2128. failed, it's supposed to return a 0, yet it doesn't, so what gives?
  2129.  
  2130.  
  2131. >>
  2132. >> At this point, I added following:
  2133. >>
  2134. > if (pic != nil) {
  2135. >       ...
  2136. > } else {
  2137. >>      MoveTo(20, 20);
  2138. >>      DrawString("\pCan't open image");
  2139. >> }
  2140. >>
  2141. >> the error message never came up!
  2142. >>
  2143. >> So what gives?  I can't load and display the image, yet the pic isn't nil
  2144. >> either!?!?!
  2145. >>
  2146.  
  2147. >        There were three statements in that last line.
  2148.  
  2149. >        1) I can't load the image
  2150. >        2) I can't display the image
  2151. >        3) The handle to the image is not nil
  2152.  
  2153. >        These can not all be true. GetPicture returns nil if it
  2154. >        was unable to load the image. Since you say "the error
  2155. >        message never came up" I will assume that 3 is true. This
  2156. >        means that 1 must be false. This leaves only 2 as a
  2157. >        problem for your application. This is what you must
  2158. >        investigate.
  2159.  
  2160. >        BTW, have you investigated how QuickDraw reports errors.
  2161. >        Given that it appears that this "feature" is occurring in
  2162. >        the DrawPicture call, how would you know that it failed?
  2163. >        Apart from not being able to see the picture.
  2164.  
  2165.  
  2166. Yes, I was a bit unclear.  The second time I get the picture, GetPicture 
  2167. does not return a nil, yet I am unable to display the image.  I have THINK
  2168. Reference and it states that DrawPicture is a void, and it does not 
  2169. indicate any error codes from DrawPicture.  I just looked up in my IM QD 
  2170. book the QDError function.  I will use it for my app.  Thanks for the tip.
  2171.  
  2172.  
  2173. >> Do I need to do a lot of watch dogging and not let any operations be
  2174. >> performed if the app goes beneath 0k of memory is free?
  2175. >        You have less than 0k of memory free and expect the
  2176. >        program to do something?
  2177.  
  2178. That was a typo.  It should have been 10k free.
  2179.  
  2180. >        BTW, just to be a total smart-***, the generally accepted
  2181. >        way to handle this type of situation is to:
  2182.  
  2183. >        1) Figure out how much memory you application needs.
  2184. >        2) Make sure that it gets at least that much.
  2185.  
  2186. >        ;^) <--- note the smiley!
  2187.  
  2188. Yep.  Verry standard.  But the problem is this:  My app will handle an
  2189. unlimited number of files/windows (memory permitting).  I do not wish to
  2190. limit the user by only allowing them a max number of files open at a time
  2191. (like 5 or 10).  Each window/file at it's maximum will use ~ 55 handles
  2192. (I'm displaing a max of 50 icons, each is contained within an IconSuite,
  2193. which is a handle).  If I plan on having 5 files open, I should probably
  2194. call MoreMasters 4 times.  If I plan on having 10 files open, I should
  2195. probably call MoreMasters 9 times.
  2196.  
  2197. Get my point?
  2198.  
  2199. It's varriable depending on the user.  Ideally it would be nice to Call a
  2200. MoreMasters() call before I open a file, then do a DeleteMoreMasters call
  2201. (if such a call had existed) after I calosed a file.  These are all
  2202. design issues I will have to iron out I guess.
  2203.  
  2204.  
  2205. >>
  2206.  
  2207. >        If you call NewHandle, and you have no more master
  2208. >        pointers available, NewHandle will call MoreMasters for
  2209. >        you. The point behind doing it youself is that master
  2210. >        pointer blocks are non-relocatable and tend to lead to
  2211. >        heap fragmentation.
  2212.  
  2213. yep.
  2214.  
  2215. >        If you let NewHandle make the call, the master pointer
  2216. >        block will be placed as low in the heap as possible.
  2217. >        Depending on what you have been doing, you may have
  2218. >        relocatable or purgeable structures in heap below that
  2219. >        block. If you want to reuse that memory, especially with
  2220. >        something that may be larger than the things that
  2221. >        previously occupied that space (as seems like you may) you
  2222. >        are unable to because you have a master pointer block
  2223. >        sitting where you need to put your new structure.
  2224. yep
  2225. >        Go ahead and call MoreMasters two, three... maybe ten
  2226. >        times early in your program. Master pointer blocks are
  2227. >        pretty small compared to the space you could loose letting
  2228. >        NewHandle do it for you.
  2229.  
  2230. see above.
  2231.  
  2232.  
  2233. >        The memory manager has a number of calls in addition to
  2234. >        CompactMem (FreeMem and PurgeMem come to mind) but these
  2235. >        only help with relocatable and purgeable objects. If your
  2236. >        memory is fragmented, it will stay fragmented, these calls
  2237. >        only help you use the memory that you have left.
  2238.  
  2239. Yes, but for each of these call you need to specify an amount of space to try
  2240. to free up.  What I was wondering was if there was a call that causes the
  2241. system to compact ALL of the free memory.  From what I can tell, it
  2242. doesn't look like it.
  2243.  
  2244. >        From your literary reference above (an excellent starting
  2245. >        point, I might add) I assume that you are (fairly) new to
  2246. >        Macintosh programming, although from the apparent
  2247. >        complexity of your application not to programming in
  2248. >        general. Rather than answer you questions with answers, I
  2249. >        will answer them with questions and refer you to further
  2250. >        reading, so that you can learn the material yourself and
  2251. >        not have to ask again next time.
  2252.  
  2253. Pretty close.  I've been programming for several years and have
  2254. programmed several different operating systems (Unix, Atari ST/GEM,
  2255. Windows, now Mac).  I've been programming the Mac for ~ 6 months in my
  2256. spare time.  The biggest problems I have encountered w/the Mac are:
  2257.  
  2258. 1 Unconventional.  I'm not taliking about event-driven programming
  2259. conceps, but things like string types.  Who the hell even USES Str63 or
  2260. Str255?!?!???  After years of honning my pointer & string skills, I have
  2261. to deal with this junk.  If I write my own function, I use pointers, if I
  2262. use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2263. a linked list on the Mac... I DARE YOU.
  2264.  
  2265. 2 There are several good Mac programming books out there, but all only
  2266. cover the basics.  What I'd like to see is something that covers a full
  2267. scale real world type app.  One that covers such topics as Multiple
  2268. files/windows opened at a time, localization, printing, error-proofing
  2269. apps, etc...  I've seen some books that start to deal with some of these 
  2270. topics, but don't go into very much depth on them.
  2271.  
  2272. 3 Example code base is meeger.  There are several areas of Mac programming
  2273. which need some indepth examples.  The app which I'm writing shouldn't
  2274. have taken this long, but I got locked up on a couple topics.
  2275.  
  2276.  
  2277. >        (new) Inside Macintosh: Memory - for references to
  2278. >        questions about: MoreMasters, NewHandle, CompactMem,
  2279. >        PurgeMem, FreeMem, etc.
  2280.  
  2281. Don't have it, but I have THINK Reference.
  2282.  
  2283.  
  2284. >        (new) Inside Macintosh: Imaging with QuickDraw - for
  2285. >        references to questions about: DrawPicture, GetPicture,
  2286. >        etc.
  2287.  
  2288.  
  2289. Have it.
  2290.  
  2291. >--
  2292.  
  2293. >Hope this helps.
  2294.  
  2295.  
  2296. a little
  2297.  
  2298.  
  2299. Jeff
  2300.  
  2301.  
  2302.  
  2303. +++++++++++++++++++++++++++
  2304.  
  2305. >From gbolsinga@aol.com (GBolsinga)
  2306. Date: 18 Oct 1994 17:41:08 -0400
  2307. Organization: America Online, Inc. (1-800-827-6364)
  2308.  
  2309. In article <380uvh$lqm@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  2310. (Jeff Beeghly) writes:
  2311.  
  2312. >If I perform a DisposeHandle on a pic handle, how come I am not able to
  2313. >load and display the picture a second time?  DisposeHandle should just
  2314. >remove the handle, not the resouce, shouldn't it?
  2315.  
  2316. This is bad.  Use KillPicture for all PICTs that aren't resources.
  2317. Use ReleaseResource for all other PICTs.
  2318.  
  2319. Greg
  2320. MPI Multimedia
  2321.  
  2322.  
  2323. +++++++++++++++++++++++++++
  2324.  
  2325. >From bj@lamar.colostate.edu (B.J. Buchalter)
  2326. Date: Tue, 18 Oct 1994 17:10:45 -0700
  2327. Organization: CSU Physics Department
  2328.  
  2329. In article <380uvh$lqm@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  2330. (Jeff Beeghly) wrote:
  2331.  
  2332.  
  2333. >  
  2334. > I've received one reply that stated all standard system calls will most
  2335. > likely crash when memory gets too low.  Therefore, in my app, if the
  2336. > memory gets below 10k or 12k, I am going to inform the user that there is
  2337. > not enough, and that they should close a file.
  2338. >  
  2339.  
  2340. Yes, this is important. Basically, your strategy needs to be that if the
  2341. amount of free memory gets to be too small (e.g. sufficently small that
  2342. operations WILL fail), you need to disable all of the commands that will
  2343. cause memory to be allocated. That is, if you don;t have enough memory for
  2344. the about box, disable the about box command. Similarly, if you are really
  2345. low on memory, don't allow the user to open another file, and perhaps ask
  2346. them to close one, or ask them to do something else that will free up
  2347. memory.
  2348.  
  2349.  
  2350. > If I perform a DisposeHandle on a pic handle, how come I am not able to
  2351. > load and display the picture a second time?  DisposeHandle should just
  2352. > remove the handle, not the resouce, shouldn't it?
  2353.  
  2354. You definitely do not want to use DisposeHandle on a resource. The
  2355. Resource Manager keeps a table of which resources are loaded and where
  2356. they are in memory. The Memory Manager keeps a table(s) of which handles
  2357. are allocated and where they are in memory. If you tell the resource
  2358. manager to release the resource it cleans up its table and marks the
  2359. resource purgable. If you tell the memory manager to Dispose the handle,
  2360. it frees the handle, but the resource manager still thinks that the handle
  2361. exists... bad news. If you make the resource purgable (HPurge), then
  2362. GetPicture will return the resource handle, even if the handle has been
  2363. purged. This means that you will get an empty PicHandle (if the available
  2364. memory is small enough). An empty PicHandle is a non-null handle that
  2365. points to a NULL value. This will cause quickdraw problems.
  2366.  
  2367. >  
  2368. > The other point I was trying to make was this:  If I can get the image
  2369. > (and pic != nil), how come I am not able to display it?  If GetPicture
  2370. > failed, it's supposed to return a 0, yet it doesn't, so what gives?
  2371.  
  2372. See above about empty PicHandles. Also, even if you do get the picture,
  2373. there may not be enough memory available for the DrawPicture command to
  2374. complete. If the picture is simply a bitmap there is not too much overhead
  2375. in DrawPicture, but if there are any regions polygons, etc, DrawPicture
  2376. can require a reasonable amount of memory. What program did you use to
  2377. create the picture? SuperPaint, for example, stuffs a lot of crap into its
  2378. pictures, including PostScript dictionaries. If you really want to be safe
  2379. for low mem conditions, convert your picture into a bitmap or a pixmap,
  2380. and use copybits to image it. Even with copybits, the fact that it is not
  2381. interrupt safe probably means that you cannot rely on it not to use
  2382. memory. 
  2383.  
  2384. Basically, the toolbox is not terribly stable under really low memory
  2385. conditions. It was generally written to assume that memory allocation will
  2386. not fail. It is your responsibility to ensure that the Toolbox has enough
  2387. memory to satisfy any allocations that it wants to make. In your case, you
  2388. have found that about 10-12K is required. You must ensure that the amount
  2389. of memory avaiable to the system never drops below this amount. Disable
  2390. commands if you must and explain to the user why these commands are
  2391. disabled.  It is better to not be able to do something than to have the
  2392. entire machine crash, especially if the function in question is simply
  2393. seeing the about box of the program.
  2394.  
  2395. If you want to get a little more sophisticated, read about growzone
  2396. functions in IM:Memory. This will allow you to set aside some 'emergency'
  2397. memory for those system calls that just cannot fail.
  2398.  
  2399. >
  2400. > Yes, I was a bit unclear.  The second time I get the picture, GetPicture 
  2401. > does not return a nil, yet I am unable to display the image.  I have THINK
  2402. > Reference and it states that DrawPicture is a void, and it does not 
  2403. > indicate any error codes from DrawPicture.  I just looked up in my IM QD 
  2404. > book the QDError function.  I will use it for my app.  Thanks for the tip.
  2405. >  
  2406.  
  2407. See above statments about empty handles and DrawPicture. 
  2408.  
  2409. > >> Do I need to do a lot of watch dogging and not let any operations be
  2410. > >> performed if the app goes beneath 10k of memory is free?
  2411. > >        You have less than 10k of memory free and expect the
  2412. > >        program to do something?
  2413. >  
  2414.  
  2415. Yes. But you should allow operations that increase the amount of free memory.
  2416.  
  2417.  
  2418. > Yep.  Verry standard.  But the problem is this:  My app will handle an
  2419. > unlimited number of files/windows (memory permitting).  I do not wish to
  2420. > limit the user by only allowing them a max number of files open at a time
  2421. > (like 5 or 10).  Each window/file at it's maximum will use ~ 55 handles
  2422. > (I'm displaing a max of 50 icons, each is contained within an IconSuite,
  2423. > which is a handle).  If I plan on having 5 files open, I should probably
  2424. > call MoreMasters 4 times.  If I plan on having 10 files open, I should
  2425. > probably call MoreMasters 9 times.
  2426. >  
  2427. > Get my point?
  2428. >  
  2429. > It's varriable depending on the user.  Ideally it would be nice to Call a
  2430. > MoreMasters() call before I open a file, then do a DeleteMoreMasters call
  2431. > (if such a call had existed) after I calosed a file.  These are all
  2432. > design issues I will have to iron out I guess.
  2433. >  
  2434. >  
  2435.  
  2436. There are a few things realed to this question. A master pointer block has
  2437. 100 master pointers. The space for the pointers plus overhead is about 512
  2438. bytes (I think... don't remember exactly). You can get approx. 2 files per
  2439. master pointer block. If you initialize, say, 20 master pointer blocks,
  2440. that is only about 10k and it will allow approx. 40 windows before you
  2441. automagically get a new block. Probably OK (not many people can deal with
  2442. 40 windows at once). Remeber, you need the master pointer blocks for other
  2443. types of handles also... not too much of a problem to have too many. Also,
  2444. will all of the icons in every window be different? 40 x 50 = 2000. I
  2445. would be really surprized if your app would actually have to show 2000
  2446. different icon suites (I could be wrong). You might look at sharing
  2447. handles for the common suites (This could be a big win).
  2448.  
  2449. If all of the above does not appeal, you can also look at generating new
  2450. heaps for each window (probably not a great solution).
  2451.  
  2452. But finally, fragmentation happens. You do everything you can to avoid it,
  2453. but there are parts of the toolbox that make it kind of difficult (if you
  2454. want to have no limits on your code). It is not the end of the world, just
  2455. something to be avoided. Especially if, as in your case, each window will
  2456. require approximately the same amount of space. If you have a memory map
  2457. like
  2458.  
  2459.    X
  2460.    P
  2461.    X <-
  2462.    X
  2463.    X
  2464.    X
  2465.    P
  2466.    P
  2467.    P
  2468.    P
  2469.  
  2470. where X = stuff for the window
  2471. and P = non-relocatable (e.g. Master pointer block)
  2472. if one window is closed (the one with the '<-', say) and another is
  2473. opened, then with what you have described, the new window ought to fit
  2474. into the memory occupied by the old window. In this case the fragmentation
  2475. does not affect you. 
  2476.  
  2477. [stuff about memory management and MP blocks]
  2478.  
  2479. see above
  2480.   
  2481.  
  2482. > 1 Unconventional.  I'm not taliking about event-driven programming
  2483. > conceps, but things like string types.  Who the hell even USES Str63 or
  2484. > Str255?!?!???  After years of honning my pointer & string skills, I have
  2485. > to deal with this junk.  If I write my own function, I use pointers, if I
  2486. > use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2487. > a linked list on the Mac... I DARE YOU.
  2488.  
  2489. The Str63/Str255 is a legacy from pascal, and certain limits imposed from
  2490. the early design of the operating system (e.g. filename length limits).
  2491. They are generally not a problem (but I guess that I am used to them).
  2492.  
  2493. As far as linked lists goes.... use them all of the time. What is the problem?
  2494.  
  2495. > 3 Example code base is meeger.  There are several areas of Mac programming
  2496. > which need some indepth examples.  The app which I'm writing shouldn't
  2497. > have taken this long, but I got locked up on a couple topics.
  2498. >  
  2499.  
  2500. Well, I guess that it is hard to make these claims if you don;t have
  2501. access to New Inside Macintosh. There are pretty good examples and
  2502. explanations of many of the issues you mention. Also, there is alot of
  2503. good source out on the net that essentially functions as sample code of
  2504. the type that you are looking for.
  2505.  
  2506. >  
  2507. > >        (new) Inside Macintosh: Memory - for references to
  2508. > >        questions about: MoreMasters, NewHandle, CompactMem,
  2509. > >        PurgeMem, FreeMem, etc.
  2510. >  
  2511. > Don't have it, but I have THINK Reference.
  2512. >  
  2513.  
  2514. Think reference is not really a substitute.
  2515.  
  2516. Good luck, and don't let it get you down. It gets easier. Really.
  2517.  
  2518. B.J.
  2519.  
  2520. +++++++++++++++++++++++++++
  2521.  
  2522. >From Glenn L. Austin <glenn_a@efn.org>
  2523. Date: Wed, 19 Oct 1994 04:02:29 GMT
  2524. Organization: Eugene FreeNet
  2525.  
  2526. In article <380uvh$lqm@nntp1.u.washington.edu> Jeff Beeghly,
  2527. jbeeghly@u.washington.edu writes:
  2528. >Pretty close.  I've been programming for several years and have
  2529. >programmed several different operating systems (Unix, Atari ST/GEM,
  2530. >Windows, now Mac).  I've been programming the Mac for ~ 6 months in my
  2531. >spare time.
  2532.  
  2533. 6 months is really not long enough to know the toolbox very well, but
  2534. certainly long enough to get a feel of what programming the Mac is like. 
  2535. It's taken me 10 years to REALLY understand the guts of how the Macintosh
  2536. work -- and I was programming for 10 years prior to the Mac introduction
  2537. (mainframes, minis, micros).
  2538.  
  2539. In relation to your problem with the pictures, if the handle is NULL, the
  2540. resource didn't exist. If the first dereference of the handle is NULL,
  2541. there either wasn't enough memory to load the resource, or the resource
  2542. was purged.  If the first dereference is NULL, call LoadResource to see
  2543. if you can load it.  Code that I use for loading any handle looks like
  2544. this:
  2545.  
  2546.     Handle h = GetResource('XXXX', id);
  2547.  
  2548.     if (h)            // resource exists?
  2549.     {
  2550.         if (!*h)
  2551.             LoadResource(h);
  2552.  
  2553.         if (*h)
  2554.         {
  2555.             // use the resource
  2556.         }
  2557.  
  2558.         ReleaseResource(h);            // or HPurge(h) is even better!
  2559.     }
  2560.  
  2561. >The biggest problems I have encountered w/the Mac are:
  2562. >1 Unconventional.  I'm not taliking about event-driven programming
  2563. >conceps, but things like string types.  Who the hell even USES Str63 or
  2564. >Str255?!?!???  After years of honning my pointer & string skills, I have
  2565. >to deal with this junk.  If I write my own function, I use pointers, if I
  2566. >use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2567. >a linked list on the Mac... I DARE YOU.
  2568.  
  2569. No problem.  I use linked lists all the time.  Pointer AND Handles.
  2570.  
  2571. >2 There are several good Mac programming books out there, but all only
  2572. >cover the basics.  What I'd like to see is something that covers a full
  2573. >scale real world type app.  One that covers such topics as Multiple
  2574. >files/windows opened at a time, localization, printing, error-proofing
  2575. >apps, etc...  I've seen some books that start to deal with some of these 
  2576. >topics, but don't go into very much depth on them.
  2577.  
  2578. I agree.  I've been thinking about that one for a while.  Especially
  2579. printing.  Printing is *EASY* on the Mac.  Try writing a simple printable
  2580. app for Windows -- what a NIGHTMARE!  For example, under Windows, you
  2581. have to do your own scaling (Move and Line are
  2582. device-resolution-specific, but Ellipse and such are based upon the
  2583. current scaling factor set).  I also found a major bug in printing
  2584. landscape (on an HP PCL printer) -- the same code which worked correctly
  2585. when printing portrait broke badly when printing landscape.  Items were
  2586. moved, portions of graphic items were drawn in different places on the
  2587. page (for example, half of an ellipse was drawn in one spot, the other
  2588. half was drawn in another spot, and there was white space between the two
  2589. halves!).  I ended up writing my own landscape code, and letting the
  2590. print drivers (plural -- each printer does its own print code) tell me
  2591. whether I should do my landscaping code.  That bug alone took two months
  2592. to find, diagnose and fix, because, although you can rotate text, many of
  2593. the parts of Windows GDI break down when dealing with vertical rather
  2594. than horizontal text.
  2595.  
  2596. >3 Example code base is meeger.  There are several areas of Mac
  2597. programming
  2598. >which need some indepth examples.  The app which I'm writing shouldn't
  2599. >have taken this long, but I got locked up on a couple topics.
  2600.  
  2601. I definately agree on this one, especially some of the newer managers! 
  2602. However, many of the newer managers (that are extensive, like AOCE or
  2603. QDGX) have many example programs to search through to find the answers to
  2604. many questions.
  2605.  
  2606. However, it has been my experience that Windows programming examples are
  2607. even scarcer -- I had to find PD applications which addressed some of the
  2608. same issues I had to deal with!  Microsoft basically doesn't provide
  2609. anything easily accessable, and although Borland did provide some sample
  2610. code with their compiler, most of it had to do with the "bells &
  2611. whistles" of Windows, like OLE, MCI, and so forth, but very little on
  2612. standard "how to display a window contents and deal with scroll bars."  I
  2613. basically had to experiment with that until I got it right -- another two
  2614. months down the drain.
  2615.  
  2616. The same basic program that I wrote under Windows which took 12 months to
  2617. write and debug took 1 weekend (that's less than 40 hrs, folks!) to write
  2618. using Symantec C++ and TCL.  Much of the stuff I got for free on the
  2619. Macintosh.  Much of the stuff I had to write under Windows...
  2620. //
  2621. // Glenn L. Austin
  2622. // Computer Wizard and Racing Car Driver
  2623. // Internet:  glenn_a@efn.org
  2624. //
  2625.  
  2626. +++++++++++++++++++++++++++
  2627.  
  2628. >From Jaeger@fquest.com (Brian Stern)
  2629. Date: 19 Oct 1994 17:25:21 GMT
  2630. Organization: The University of Texas at Austin, Austin, Texas
  2631.  
  2632. In article <380uvh$lqm@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  2633. (Jeff Beeghly) wrote:
  2634.  
  2635. <  
  2636. <  
  2637. < >> Do I need to do a lot of watch dogging and not let any operations be
  2638. < >> performed if the app goes beneath 0k of memory is free?
  2639. < >        You have less than 0k of memory free and expect the
  2640. < >        program to do something?
  2641. <  
  2642. < That was a typo.  It should have been 10k free.
  2643. <  
  2644. < >        BTW, just to be a total smart-***, the generally accepted
  2645. < >        way to handle this type of situation is to:
  2646. <  
  2647. < >        1) Figure out how much memory you application needs.
  2648. < >        2) Make sure that it gets at least that much.
  2649. <  
  2650. < >        ;^) <--- note the smiley!
  2651. <  
  2652. < Yep.  Verry standard.  But the problem is this:  My app will handle an
  2653. < unlimited number of files/windows (memory permitting).  I do not wish to
  2654. < limit the user by only allowing them a max number of files open at a time
  2655. < (like 5 or 10).  Each window/file at it's maximum will use ~ 55 handles
  2656. < (I'm displaing a max of 50 icons, each is contained within an IconSuite,
  2657. < which is a handle).  If I plan on having 5 files open, I should probably
  2658. < call MoreMasters 4 times.  If I plan on having 10 files open, I should
  2659. < probably call MoreMasters 9 times.
  2660. <  
  2661. < Get my point?
  2662. <  
  2663. < It's varriable depending on the user.  Ideally it would be nice to Call a
  2664. < MoreMasters() call before I open a file, then do a DeleteMoreMasters call
  2665. < (if such a call had existed) after I calosed a file.  These are all
  2666. < design issues I will have to iron out I guess.
  2667. <  
  2668. <  
  2669.  
  2670. Most of the sample code I've seen uses a size of about 40K as the time to
  2671. post a low memory warning.  Since we're talking about 'Real World' apps
  2672. you should know that ALL real world apps have a growZone procedure and use
  2673. some mechanism for keeping a buffer of memory available.  Usually this
  2674. done by a mechanism known as the rainy-day fund.  Briefly, at app startup
  2675. you allocate a handle of, say, 40K.  That's your rainy day fund.  Each
  2676. time through your main event loop ( or perhaps only on null events) you
  2677. check the available memory.  If it's too low you post a warning alert. 
  2678. Under some circumstances you release the rainy day handle.  Either from
  2679. your growZone Proc or possibly in response to an explicit call from
  2680. somewhere in your app.
  2681.  
  2682. Regarding the MoreMasters calls.  Exercise your app thoroughly with a
  2683. number of windows/documents open that is on the high side of what you
  2684. would consider avaerage.  See how many Master Pointer blocks were needed. 
  2685. Maybe add 2 or 3 to this number and call MoreMasters this many times. 
  2686. Eight or ten should be more than sufficient.  Realize that any user that
  2687. sees the 'not enough memory' warning is going to up the partition size for
  2688. the app.  Although this doesn't automatically increase the number of
  2689. Master Pointer blocks it does give the app more breathing room so that if
  2690. any are automatically allocated any problems caused by heap fragmentation
  2691. are minimized.  The important thing is to warn when memory gets low.
  2692.  
  2693.  
  2694. <   The biggest problems I have encountered w/the Mac are:
  2695. <  
  2696. < 1 Unconventional.  I'm not taliking about event-driven programming
  2697. < conceps, but things like string types.  Who the hell even USES Str63 or
  2698. < Str255?!?!???  After years of honning my pointer & string skills, I have
  2699. < to deal with this junk.  If I write my own function, I use pointers, if I
  2700. < use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2701. < a linked list on the Mac... I DARE YOU.
  2702.  
  2703. Gee Jeff, we were just beginning to like you, and then you turn on us like
  2704. this:)  Are you aware that your windowlist is a linked list?  There are
  2705. numerous operating system queues that are linked lists.  Doing linked
  2706. lists with memory allocated by NewPtr or by malloc is no different than on
  2707. any other architecture.  You can do linked lists with handles.  The only
  2708. difference is an extra * here or there when referring to the memory
  2709. blocks.
  2710.  
  2711. If you're not aware, the reason for the Str255 and friends string types
  2712. are due to the Mac's Pascal heritage.  Don't complain about it, just
  2713. accept it.  Every development environment has utility routines to
  2714. translate between C and P strings.  Sorry you had to learn something new.
  2715.  
  2716. <  
  2717. < 2 There are several good Mac programming books out there, but all only
  2718. < cover the basics.  What I'd like to see is something that covers a full
  2719. < scale real world type app.  One that covers such topics as Multiple
  2720. < files/windows opened at a time, localization, printing, error-proofing
  2721. < apps, etc...  I've seen some books that start to deal with some of these 
  2722. < topics, but don't go into very much depth on them.
  2723. <  
  2724. < 3 Example code base is meeger.  There are several areas of Mac programming
  2725. < which need some indepth examples.  The app which I'm writing shouldn't
  2726. < have taken this long, but I got locked up on a couple topics.
  2727.  
  2728. Are you aware of the sample code at ftp.apple.com and at the
  2729. alt.sources.mac archive at ftp://ftpbio.bgsu.edu/?
  2730.  
  2731. <  
  2732. <  
  2733. <  
  2734. < Have it.
  2735. <  
  2736. < >--
  2737. <  
  2738. < >Hope this helps.
  2739. <  
  2740. <  
  2741. < a little
  2742. <  
  2743. <  
  2744. < Jeff
  2745.  
  2746. Good luck,
  2747.  
  2748. -- 
  2749. Brian  Stern  :-{)}
  2750. Toolbox commando and Menu bard
  2751. Jaeger@fquest.com
  2752.  
  2753. +++++++++++++++++++++++++++
  2754.  
  2755. >From ari@world.std.com (Ari I Halberstadt)
  2756. Date: Thu, 20 Oct 1994 04:00:28 GMT
  2757. Organization: The World Public Access UNIX, Brookline, MA
  2758.  
  2759. In article <Jaeger-1910941228440001@slip-8-14.ots.utexas.edu>,
  2760. Brian Stern <Jaeger@fquest.com> wrote:
  2761. >In article <380uvh$lqm@nntp1.u.washington.edu>, jbeeghly@u.washington.edu
  2762. >(Jeff Beeghly) wrote:
  2763. >
  2764. ><  
  2765. ><  
  2766. >< >> Do I need to do a lot of watch dogging and not let any operations be
  2767. >< >> performed if the app goes beneath 0k of memory is free?
  2768. >...
  2769. >< Get my point?
  2770.  
  2771. Get ZoneRanger and a color monitor. This is the *coolest* free program
  2772. for figuring out what the heck your app is doing in its memory
  2773. partition. It should be on any archive site and plenty of CDs.
  2774. Also, get ProcessWatcher, another free and useful tool.
  2775.  
  2776. >Most of the sample code I've seen uses a size of about 40K as the time to
  2777. >post a low memory warning.  Since we're talking about 'Real World' apps
  2778. >you should know that ALL real world apps have a growZone procedure and use
  2779. >some mechanism for keeping a buffer of memory available.  Usually this
  2780. >done by a mechanism known as the rainy-day fund.  Briefly, at app startup
  2781. >you allocate a handle of, say, 40K.  That's your rainy day fund.  Each
  2782. >time through your main event loop ( or perhaps only on null events) you
  2783. >check the available memory.  If it's too low you post a warning alert. 
  2784. >Under some circumstances you release the rainy day handle.  Either from
  2785. >your growZone Proc or possibly in response to an explicit call from
  2786. >somewhere in your app.
  2787.  
  2788. I've abstracted and elaborated this. Each level in an app gets a
  2789. reserve memory. Then there's a memory cushion in addition. The app
  2790. sets the allocation level. The Toolbox level is the lowest, since the
  2791. TB can crash if it doesn't get memory. When I need to allocate memory,
  2792. I bump up the level, then restore it afterwards. For critical things,
  2793. like quitting and saving a file, I bump up the memory to a "critical"
  2794. level. Each level allows access to different memory reserves. The size
  2795. of the memory reserves for each level is set in a configuration
  2796. resource. The grow zone function runs a loop in which it frees up
  2797. reserves (depending on the current level) until enough bytes have been
  2798. freed. Memory warnings are issued depending on how much of the
  2799. reserves are depleted and how little memory is left. At each warning
  2800. level, the application can take different actions, e.g., at first just
  2801. an alert, then disabling functions like undo, then automatically
  2802. asking the user to close files, then automatically closing unmodified
  2803. files and saving modified files to temporary locations, and, finally,
  2804. terminating the application if all of the reserves are depleted and
  2805. there is very little memory left (e.g., less than 10K). I also have
  2806. code to automatically unload inactive segments, but it's not very
  2807. portable (works only with THINK C, not with Metrowerks).
  2808.  
  2809. >...
  2810. >< 1 Unconventional.  I'm not taliking about event-driven programming
  2811. >< conceps, but things like string types.  Who the hell even USES Str63 or
  2812. >< Str255?!?!???  After years of honning my pointer & string skills, I have
  2813. >< to deal with this junk.  If I write my own function, I use pointers, if I
  2814. >< use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2815. >< a linked list on the Mac... I DARE YOU.
  2816. >...
  2817. >If you're not aware, the reason for the Str255 and friends string types
  2818. >are due to the Mac's Pascal heritage.  Don't complain about it, just
  2819. >accept it.  Every development environment has utility routines to
  2820. >translate between C and P strings.  Sorry you had to learn something new.
  2821.  
  2822. I got tired of worrying about string types. At first, I just made a
  2823. rule that everything was a C string, and wrote wrappers around
  2824. offending toolbox routines. Then I decided it just didn't make sense
  2825. to worry about how long a string is, especially for variable length
  2826. things. So I wrote a string library that allocates everything
  2827. dynamically, and even replaces sprintf. This would have been easier
  2828. with C++, but hey, it works even with C. For string-intensive portions
  2829. of my code where many strings are used and where performance is
  2830. important, say parsing, I use direct pointers and allocate things from
  2831. a large chunk of memory or use a fixed string length. the string
  2832. library has functions for converting to and from regular C or Pascal
  2833. strings.
  2834.  
  2835. >< 3 Example code base is meeger.  There are several areas of Mac programming
  2836. >< which need some indepth examples.  The app which I'm writing shouldn't
  2837. >< have taken this long, but I got locked up on a couple topics.
  2838. >
  2839. >Are you aware of the sample code at ftp.apple.com and at the
  2840. >alt.sources.mac archive at ftp://ftpbio.bgsu.edu/?
  2841.  
  2842. Yup, I'd have to agree that there's tons of sample code. And there's
  2843. all the sample code that comes with your compiler (e.g., TC,
  2844. Metrowerks), and with Develop, etc.
  2845.  
  2846. -- 
  2847. "Ramsgate (n.) All institutional buildings must, by law, contain at
  2848. least twenty ramsgates. These are doors that open the opposite way to
  2849. the one you expect." -- D. Adams & J. Lloyd "The Meaning of Liff", p75.
  2850.  
  2851. +++++++++++++++++++++++++++
  2852.  
  2853. >From ari@world.std.com (Ari I Halberstadt)
  2854. Date: Thu, 20 Oct 1994 04:25:35 GMT
  2855. Organization: The World Public Access UNIX, Brookline, MA
  2856.  
  2857. In article <CxyDst.7n0@world.std.com>,
  2858. Ari I Halberstadt <ari@world.std.com> wrote:
  2859. >I've abstracted and elaborated this. Each level in an app gets a
  2860. >reserve memory. Then there's a memory cushion in addition. The app
  2861. >sets the allocation level. The Toolbox level is the lowest, since the
  2862. >TB can crash if it doesn't get memory. When I need to allocate memory,
  2863. >I bump up the level, then restore it afterwards. For critical things,
  2864. >like quitting and saving a file, I bump up the memory to a "critical"
  2865. >level. Each level allows access to different memory reserves. The size
  2866. >...
  2867.  
  2868. This paragraph is inconsistent. Basically, the Toolbox level has the
  2869. highest priority. The normal priority is the Toolbox level, since
  2870. there are so many TB calls that can allocate memory it's just easier
  2871. to keep it as the default. At the TB level, both my reserves and the
  2872. TB reserves can be accessed. When I allocate memory, I lower the
  2873. priority so as not to deplete the TB reserves, but I can still deplete
  2874. my reserves. This scheme can be extended to any number of levels
  2875. (which, in my case, is a bit necessary, since I have the TB, low-level
  2876. libraries, then the real application, each of which should have their
  2877. own reserves, even though my libraries aren't supposed to crash if
  2878. they run out of memory).
  2879. -- 
  2880. "Ramsgate (n.) All institutional buildings must, by law, contain at
  2881. least twenty ramsgates. These are doors that open the opposite way to
  2882. the one you expect." -- D. Adams & J. Lloyd "The Meaning of Liff", p75.
  2883.  
  2884. +++++++++++++++++++++++++++
  2885.  
  2886. >From h+@nada.kth.se (Jon W{tte)
  2887. Date: Thu, 20 Oct 1994 19:44:46 +0100
  2888. Organization: Royal Institute of Something or other
  2889.  
  2890. In article <Jaeger-1910941228440001@slip-8-14.ots.utexas.edu>,
  2891. Jaeger@fquest.com (Brian Stern) wrote:
  2892.  
  2893. >< conceps, but things like string types.  Who the hell even USES Str63 or
  2894. >< Str255?!?!???  After years of honning my pointer & string skills, I have
  2895. >< to deal with this junk.  If I write my own function, I use pointers, if I
  2896. >< use a toolbox call, well... I use  StrXXX.  And linked lists... try doing
  2897. >< a linked list on the Mac... I DARE YOU.
  2898.  
  2899. I use Str31, Str63 and Str255 where appropriate; mostly as 
  2900. structure members and stack-based variables.
  2901.  
  2902. Anyone who knows enough C or C++ to program any computer for a 
  2903. living (in those languages...) knows that when you have a 
  2904. typedef:
  2905.  
  2906. typedef unsigned char Str31 [ 32 ] ;
  2907.  
  2908. what really gets passed to functions is a pointer to unsigned 
  2909. char, so all functions should be declared as:
  2910.  
  2911. void
  2912. MyFunc (
  2913.     const unsigned char * source ,
  2914.     unsigned char * dest )
  2915.  
  2916.  
  2917. Similarly; you can pass an unsigned char pointer everywhere the 
  2918. headers say "StrXXX"
  2919.  
  2920. Similarly for linked lists; use malloc() if you like it better, 
  2921. or use NewPtr(). Or do a linked list with Handles; it's really 
  2922. easy:
  2923.  
  2924. typedef struct elem {
  2925.     struct elem * * next ;
  2926.     long data ;
  2927. } elem , * elemPtr , * * elemHandle ;
  2928.  
  2929. elemHandle theList ;
  2930.  
  2931. void
  2932. insertelematend (
  2933.     long data )
  2934. {
  2935.     elemHandle theE = ( elemHandle ) NewHandle ( sizeof ( elem ) ) ;
  2936.     elemHandle * theP = & theList ;
  2937.  
  2938.     ( * theE ) -> next = NULL ;
  2939.     ( * theE ) -> data = data ;
  2940.     while ( * theP )
  2941.     {
  2942.         theP = & ( * theP ) -> next ;
  2943.     }
  2944.     * theP = theE ;
  2945. }
  2946.  
  2947.  
  2948. Cheers,
  2949.  
  2950.                 / h+
  2951.  
  2952.  
  2953. --
  2954.   Jon Wätte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  2955.    This is the kind of totally-gross-out-sick stuff you can do with C++ that
  2956.    makes the language kind of neat.
  2957.                                             -- Keith Rollin
  2958.  
  2959.  
  2960. +++++++++++++++++++++++++++
  2961.  
  2962. >From lsr@taligent.com (Larry Rosenstein)
  2963. Date: Wed, 19 Oct 1994 01:22:44 GMT
  2964. Organization: Taligent, Inc.
  2965.  
  2966. In article <bj-1810941710450001@ivan.physics.colostate.edu>,
  2967. bj@lamar.colostate.edu (B.J. Buchalter) wrote:
  2968.  
  2969. > Yes, this is important. Basically, your strategy needs to be that if the
  2970. > amount of free memory gets to be too small (e.g. sufficently small that
  2971. > operations WILL fail), you need to disable all of the commands that will
  2972.  
  2973. You also have to make sure that the amount of free memory doesn't get so
  2974. small that the user can't save documents, quit, etc.
  2975.  
  2976. -- 
  2977. Larry Rosenstein
  2978. Taligent, Inc.
  2979.  
  2980. lsr@taligent.com
  2981.  
  2982. +++++++++++++++++++++++++++
  2983.  
  2984. >From Peter_Gontier@novell.com (Pete Gontier)
  2985. Date: Mon, 24 Oct 1994 19:52:54 -0800
  2986. Organization: Novell, Inc., Walnut Creek Macintosh Site
  2987.  
  2988. In article <380uvh$lqm@nntp1.u.washington.edu>,
  2989. jbeeghly@u.washington.edu (Jeff Beeghly) wrote:
  2990.  
  2991. > I've received one reply that stated all standard system calls will most
  2992. > likely crash when memory gets too low.  Therefore, in my app, if the
  2993. > memory gets below 10k or 12k, I am going to inform the user that there is
  2994. > not enough, and that they should close a file.
  2995.  
  2996. Try 33K. Why? Because 32K is the largest several of the more complicated
  2997. data structures in the Toolbox can be. Add 1K for super-emergencies and
  2998. you should be better off than using only 12K.
  2999.  
  3000. > The other point I was trying to make was this:  If I can get the image
  3001. > (and pic != nil), how come I am not able to display it?  If GetPicture
  3002. > failed, it's supposed to return a 0, yet it doesn't, so what gives?
  3003.  
  3004. Because the data in a 'PICT' is compressed. It gets expanded somewhat
  3005. during DrawPicture.
  3006.  
  3007. Also, consider skipping calls like GetPicture and simply using GetResource
  3008. directly. It provides an opportunity to do better error checking at the
  3009. price of the following difference in typing:
  3010.  
  3011.         PicHandle ph = GetPicture (128);
  3012.  
  3013.         PicHandle ph = (PicHandle) GetResource ('PICT',128);
  3014.  
  3015. Now you can call 'ResError' and find out all the other things which might
  3016. have gone wrong other than 'resNotFound'.
  3017.  
  3018. >The biggest problems I have encountered w/the Mac are:
  3019. >  
  3020. > 1 Unconventional.  I'm not taliking about event-driven programming
  3021. > conceps, but things like string types.  Who the hell even USES Str63 or
  3022. > Str255?!?!???  After years of honning my pointer & string skills, I have
  3023. > to deal with this junk.  If I write my own function, I use pointers, if I
  3024. > use a toolbox call, well... I use  StrXXX.
  3025.  
  3026. I actually prefer Pascal strings for most operations because I always have
  3027. the length available without worrying about caching the result of
  3028. 'strlen'. The fact that there are a zillion 'Str...' shouldn't faze you;
  3029. they're just Pascal strings with different maximum sizes. I use 'Str15',
  3030. for example, all the time for quick calls to 'NumToString'.
  3031.  
  3032. > And linked lists... try doing
  3033. > a linked list on the Mac... I DARE YOU.
  3034.  
  3035. I have. Other posters have pointed out that handles on the Macintosh are
  3036. not the same as handles on Windows. There's no more difficulty in writing
  3037. linked list code on the Mac than there is in typing an extra '*'. (It's
  3038. when people start trying to optimize the double-dereferencing that they
  3039. get into trouble.)
  3040.  
  3041. > 3 Example code base is meeger.  There are several areas of Mac programming
  3042. > which need some indepth examples.  The app which I'm writing shouldn't
  3043. > have taken this long, but I got locked up on a couple topics.
  3044.  
  3045. This is an odd observation, given that you appear to have "real" internet
  3046. access. Perhaps you are unaware of the many 'ftp' archive sites. There is
  3047. also copious example code on the various CD ROMs produced by Apple.
  3048.  
  3049. > >        (new) Inside Macintosh: Memory - for references to
  3050. > >        questions about: MoreMasters, NewHandle, CompactMem,
  3051. > >        PurgeMem, FreeMem, etc.
  3052. >  
  3053. > Don't have it, but I have THINK Reference.
  3054.  
  3055. You absitively posolutely need to buy the relevant Inside Macintosh
  3056. volumes. They cost a lot of money. You need to buy them anyway.
  3057.  
  3058. -- 
  3059.  Views expressed here do not necessarily reflect the views of Novell.
  3060.  
  3061. ---------------------------
  3062.  
  3063. >From pwhull@crl.com (Peter Hull)
  3064. Subject: NewGWorld returns null pointer
  3065. Date: 20 Oct 1994 09:24:21 GMT
  3066. Organization: CRL Dialup Internet Access    (415) 705-6060  [Login: guest]
  3067.  
  3068. Hello,
  3069.  
  3070. I have a problem related to using GWorlds-- NewGWorld returns null in the
  3071. GWorld pointer.  I am using TCL 1.1.3.  When the problem occurs, I already
  3072. have one document object open, identical to the one I am trying to create.
  3073. If I close the first document and then open a second one, everything is
  3074. cool.  But if I try to open a second document while the first is still open,
  3075. when my CGWorld object calls NewGWorld to create the offscreen world, it
  3076. gets this null pointer.  I am running the program in 4 megs of memory,
  3077. and the images are only 256x256 pixels.  (I'm using the Pico sample images
  3078. from 'develop' #10, from 'develop' CD #19.)
  3079.  
  3080. Does anybody have any idea why NewGWorld would return a null GWorld?  There's
  3081. nothing in Inside Macintosh that would suggest that NewGWorld might return
  3082. a null pointer except for the example code in NIM: "Imaging with QuickDraw",
  3083. chapter 6, which tests for a null pointer.  That is where I got the idea that
  3084. that might be the problem.  (Originally I thought the problem might be with
  3085. DrawPicture, because that's where the program froze.)
  3086.  
  3087. Any help would be appreciated...
  3088.  
  3089. Thanks in advance!
  3090.  
  3091. --
  3092. --
  3093. Peter Hull <pwhull@crl.com>
  3094.  
  3095. +++++++++++++++++++++++++++
  3096.  
  3097. >From pwhull@crl.com (Peter Hull)
  3098. Date: 20 Oct 1994 21:18:34 GMT
  3099. Organization: CRL Dialup Internet Access    (415) 705-6060  [Login: guest]
  3100.  
  3101. Peter Hull (pwhull@crl.com) wrote:
  3102. : Hello,
  3103.  
  3104. : I have a problem related to using GWorlds-- NewGWorld returns null in the
  3105. : GWorld pointer.  I am using TCL 1.1.3.  When the problem occurs, I already
  3106. : have one document object open, identical to the one I am trying to create.
  3107. : If I close the first document and then open a second one, everything is
  3108. : cool.  But if I try to open a second document while the first is still open,
  3109. : when my CGWorld object calls NewGWorld to create the offscreen world, it
  3110. : gets this null pointer.  I am running the program in 4 megs of memory,
  3111. : and the images are only 256x256 pixels.  (I'm using the Pico sample images
  3112. : from 'develop' #10, from 'develop' CD #19.)
  3113.  
  3114. : Does anybody have any idea why NewGWorld would return a null GWorld?  There's
  3115. : nothing in Inside Macintosh that would suggest that NewGWorld might return
  3116. : a null pointer except for the example code in NIM: "Imaging with QuickDraw",
  3117. : chapter 6, which tests for a null pointer.  That is where I got the idea that
  3118. : that might be the problem.  (Originally I thought the problem might be with
  3119. : DrawPicture, because that's where the program froze.)
  3120.  
  3121. I now have discovered that the problem occurs also on the first document
  3122. object sometimes.  Why this is I still have no idea.  Here is the call,
  3123. straight from my source code:
  3124.  
  3125.     FailOSErr(anErr = NewGWorld(&itsWorld, depth,
  3126.                   &boundsRect, NULL, NULL, 0));
  3127.  
  3128. 'boundsRect' is { 0, 0, 256, 256 }, 'depth' is 16.
  3129.  
  3130. After the call, sometimes 'itsWorld' is NULL.
  3131.  
  3132. However, I have never had an error show up in 'anErr'.
  3133. Any ideas?
  3134.  
  3135. --
  3136. --
  3137. Peter Hull <pwhull@crl.com>
  3138.  
  3139. +++++++++++++++++++++++++++
  3140.  
  3141. >From Jaeger@fquest.com (Brian Stern)
  3142. Date: 23 Oct 1994 18:07:12 GMT
  3143. Organization: The University of Texas at Austin, Austin, Texas
  3144.  
  3145. In article <386mra$kqk@nntp.crl.com>, pwhull@crl.com (Peter Hull) wrote:
  3146.  
  3147. < Peter Hull (pwhull@crl.com) wrote:
  3148. < : Hello,
  3149. < : I have a problem related to using GWorlds-- NewGWorld returns null in the
  3150. < : GWorld pointer.  I am using TCL 1.1.3.  When the problem occurs, I already
  3151. <         FailOSErr(anErr = NewGWorld(&itsWorld, depth,
  3152. <                   &boundsRect, NULL, NULL, 0));
  3153. < 'boundsRect' is { 0, 0, 256, 256 }, 'depth' is 16.
  3154. < After the call, sometimes 'itsWorld' is NULL.
  3155. < However, I have never had an error show up in 'anErr'.
  3156. < Any ideas?
  3157. < --
  3158. < --
  3159. < Peter Hull <pwhull@crl.com>
  3160.  
  3161. Actually this very question was posted a month or so back.  Are you
  3162. locking the object before making this call?  NewGWorld moves memory.  TCL
  3163. 1.1.3 objects are handles.  If itsWorld is an instance varible and the
  3164. object is unlocked then NewGWorld will succeed but &itsWorld won't point
  3165. to the object anymore.  Either lock the object, or use a local varible for
  3166. the first parameter to NewGWorld and  then set itsWorld from the local
  3167. variable.
  3168.  
  3169. Good luck,
  3170.  
  3171. -- 
  3172. Brian  Stern  :-{)}
  3173. Toolbox commando and Menu bard
  3174. Jaeger@fquest.com
  3175.  
  3176. +++++++++++++++++++++++++++
  3177.  
  3178. >From pwhull@crl.com (Peter Hull)
  3179. Date: 24 Oct 1994 10:16:33 GMT
  3180. Organization: CRL Dialup Internet Access    (415) 705-6060  [login: guest]
  3181.  
  3182. Regarding the GWorld problem with NewGWorld returning a null pointer,
  3183. Brian Stern's solution was correct.  He suggested that the problem was
  3184. being caused by NewGWorld moving memory while the object that called
  3185. it was unlocked in the heap.  This caused the (handle-based) object to
  3186. not receive the pointer correctly.  Here is my implementation of the fix:
  3187.  
  3188. HLock ((Handle) this);
  3189.  
  3190. <NewGWorld call here>
  3191.  
  3192. HUnlock ((Handle) this);
  3193.  
  3194. Depressingly simple, isn't it?  Many thanks to Brian and also to
  3195. Francois Pottier who e-mailed me with the same solution.
  3196.  
  3197. Cheers,
  3198.  
  3199. Peter
  3200.  
  3201. --
  3202.  
  3203. Peter Hull
  3204. <pwhull@crl.com>
  3205.  
  3206. ---------------------------
  3207.  
  3208. >From mclow@san_marcos.csusm.edu (Marshall Clow)
  3209. Subject: Pathnames? I don't think so...
  3210. Date: Fri, 14 Oct 1994 17:36:29 -0700
  3211. Organization: Aladdin Systems
  3212.  
  3213. In article <272202942.8010432@chatter.chatter.com>,
  3214. Daaron_Dwyer@chatter.com wrote:
  3215.  
  3216. > Not to answer the question, but to advance it to a different level, when you
  3217. > do a call to FindFolder (let's say to find the preferences folder on the
  3218. > startup volume) and you get a Folder ID, what is the most efficient way to
  3219. > convert it or utilize the information to be a path?
  3220. > Just another newbie,
  3221.  
  3222. OK. Here we go:
  3223.    On the mac, in general, you don't want to use pathnames. Users have
  3224. this distressing habit of moving files and renaming folders.
  3225.  
  3226. To open/rename/delete/etc a file:
  3227.    All the appropriate routines take a triplet:
  3228.       volume, directory ID, and file name.
  3229. In your example, you already have a volume refnum, and directory ID,
  3230. (from your call to FindFolder), and presumably you have the name.
  3231.    err = HOpen ( vrefNum, dirID, fName, fsRdWrPerm, &refNum );
  3232.  
  3233.  
  3234. To save the location of a file so you can find it later:
  3235.    Use the alias manager.
  3236.  
  3237. NewAlias (...);
  3238. later: ResolveAlias ( ... );
  3239.  
  3240. -- 
  3241. Marshall Clow
  3242. Aladdin Systems
  3243. mclow@san_marcos.csusm.edu
  3244.  
  3245.  
  3246. ---------------------------
  3247.  
  3248. >From bb@lightside.com (Bob Bradley)
  3249. Subject: Q: Creating Variable sized structures?
  3250. Date: Sun, 16 Oct 1994 09:26:42 -0800
  3251. Organization: SS Software Inc.
  3252.  
  3253. How do you create variable sized structures, similar to how DITL resources
  3254. are used by the Dialog Manager?
  3255.  
  3256. Do they just create a handle and tack on things as they go? If so, it
  3257. would seem like they'd need some sort of index or they'd have to parse the
  3258. list each time to access individual items.
  3259.  
  3260. I'm writing a View-like library for creating Windows/Dialogs and I'm
  3261. looking for a good way to create variable sized structures that define the
  3262. details of the View but, having a tough time with this part of it.
  3263.  
  3264. Any comments appreciated.
  3265.  
  3266. +++++++++++++++++++++++++++
  3267.  
  3268. >From Eric Kidd <emk@dartmouth.edu>
  3269. Date: 18 Oct 1994 03:00:39 GMT
  3270. Organization: Dartmouth College
  3271.  
  3272. Q: Creating Variable sized structures?
  3273.  
  3274. One easy way to do this is--if the variable part of the record is of
  3275. constant
  3276. size--is to define a struct like:
  3277.  
  3278. typedef struct
  3279. {
  3280.    // header info
  3281.     
  3282.    short index;
  3283.    element_type element[1];
  3284. } myType;
  3285.  
  3286. Reference data of this type with a handle and use the memory manager
  3287. (ResizeHandle? SizeHandle? I forget at the moment.) to resize it as you
  3288. need. You
  3289. could write a routine:
  3290.  
  3291.    ResizeMyType( myType** theData, short numSlots )
  3292.  
  3293. and call it as needed. Hope this helps. Any feedback appreciated.
  3294.  
  3295. +++++++++++++++++++++++++++
  3296.  
  3297. >From Jaeger@fquest.com (Brian Stern)
  3298. Date: 18 Oct 1994 06:52:05 GMT
  3299. Organization: The University of Texas at Austin, Austin, Texas
  3300.  
  3301. In article <bb-1610940926420001@user38.lightside.com>, bb@lightside.com
  3302. (Bob Bradley) wrote:
  3303.  
  3304. < How do you create variable sized structures, similar to how DITL resources
  3305. < are used by the Dialog Manager?
  3306. < Do they just create a handle and tack on things as they go? If so, it
  3307. < would seem like they'd need some sort of index or they'd have to parse the
  3308. < list each time to access individual items.
  3309. < I'm writing a View-like library for creating Windows/Dialogs and I'm
  3310. < looking for a good way to create variable sized structures that define the
  3311. < details of the View but, having a tough time with this part of it.
  3312. < Any comments appreciated.
  3313.  
  3314. Yes, variable-sized resources are built by allocating a handle and then
  3315. tacking things onto the end of it.  The routines like GetDItem, SetDItem,
  3316. and GetIndString walk down the resource each time to find the particular
  3317. item's data.  In general these data structures are small so that finding
  3318. the third or tenth item doesn't take very long.  Finding the hundreth or
  3319. thousandth item this way would be very slow.
  3320.  
  3321. Each of the items in these variable length data structures has a length
  3322. byte or short that is at a fixed offset from the beginning of each item
  3323. (often the offset is zero) to facilitate walking down the structure.  Also
  3324. the resource has an entry count in it, usually at the beginning.  Adding a
  3325. new item at the end is just a matter of using PtrAndHand and then updating
  3326. the item counter.  Modifying existing items or inserting items in the
  3327. middle is a matter of adjusting the size of the handle and blockmove to
  3328. make space in the middle, followed by blockmove to insert the new data.
  3329.  
  3330. My personal favorite is the Speech Manager 'dict' resource.  In this
  3331. perverse resource there is a header, followed by a variable length array
  3332. of variable length records.  Each of these last records consists of two
  3333. (or more) variable length records.  Sort of like an array of STR#
  3334. resources.
  3335.  
  3336. -- 
  3337. Brian  Stern  :-{)}
  3338. Toolbox commando and Menu bard
  3339. Jaeger@fquest.com
  3340.  
  3341. +++++++++++++++++++++++++++
  3342.  
  3343. >From larson@base.cs.ucla.edu (Christopher Larson)
  3344. Date: 18 Oct 1994 16:51:27 GMT
  3345. Organization: UCLA, Computer Science Department
  3346.  
  3347. In article <37vdon$gvt@dartvax.dartmouth.edu> Eric Kidd <emk@dartmouth.edu> writes:
  3348. >Q: Creating Variable sized structures?
  3349. >
  3350. >One easy way to do this is--if the variable part of the record is of
  3351. >constant
  3352. >size--is to define a struct like:
  3353. >
  3354. >typedef struct
  3355. >{
  3356. >   // header info
  3357. >    
  3358. >   short index;
  3359. >   element_type element[1];
  3360. >} myType;
  3361.  
  3362. In THINK C (don't know about CW) it is legal to declare an array of unspecified
  3363. size (e.g. "element_type element[];") which will not contribute to the size of
  3364. the struct. Then allocation of the handle becomes:
  3365.  
  3366.   Handle  theHandle;
  3367.   Size    elementCount = kDefaultElementCount; // The number of array elements
  3368.  
  3369.   theHandle = NewHandle(sizeof(myType) + sizeof(element_type) * elementCount);
  3370.  
  3371. IMHO this is easier than having to remember that you get one element for free
  3372. in sizeof(myType).
  3373.  
  3374. >Reference data of this type with a handle and use the memory manager
  3375. >(ResizeHandle? SizeHandle? I forget at the moment.) to resize it as you
  3376. >need. You could write a routine:
  3377.  
  3378. That would be SetHandleSize();
  3379.  
  3380. All of the routines dealing with handles are documented in Inside Macintosh:
  3381. Memory.
  3382.  
  3383. --Chris
  3384. _______________________________________________________________________________
  3385. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  3386. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  3387. Death to the Trojans! Go Bruins!
  3388.  
  3389. (Insert disclaimer here)
  3390. Internet: larson@kingston.cs.ucla.edu
  3391.  
  3392. ---------------------------
  3393.  
  3394. >From b.kobben@frw.ruu.nl (Barend Kobben)
  3395. Subject: QuickTime + MIDI?
  3396. Date: Tue, 11 Oct 1994 15:45:13 GMT
  3397. Organization: Cartography dept., Utrecht University
  3398.  
  3399. Hi,
  3400.  
  3401. REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3402. Musical Instruments" extension, you have the ability to handle MIDI-files.
  3403. When openening these Midi files with a QuickTime player (like MoviePlayer,
  3404. PetersPlayer, etc.) you can convert the MIDI file to a Quicktime movie
  3405. (Sound only, of course). 
  3406. Even better is the ability (under the Options... button) to fiddle around
  3407. with the instruments. 
  3408. This means that the MIDI instruments (made by Roland, if you believe the
  3409. About... button) are there, a samples, inside these extensions!
  3410.  
  3411. QUESTION: Is there a description of this: How is it formatted, how can I
  3412. handle this from inside my programs?
  3413.  
  3414. -- 
  3415. Barend Kobben (b.kobben@frw.ruu.nl)
  3416. Cartography Dept., Utrecht University
  3417. PO Box 80115, 3508 TC Utrecht, The Netherlands
  3418. tel +31-(0)30-532086; fax +31-(0)30-540604
  3419.  
  3420. +++++++++++++++++++++++++++
  3421.  
  3422. >From sandvik@apple.com (Kent Sandvik)
  3423. Date: Sun, 16 Oct 1994 13:18:45 -0800
  3424. Organization: Apple Computer, Inc. Developer Technical Support
  3425.  
  3426. In article <b.kobben-111094164513@kartoserver.frw.ruu.nl>,
  3427. b.kobben@frw.ruu.nl (Barend Kobben) wrote:
  3428.  
  3429. > Hi,
  3430. > REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3431. > Musical Instruments" extension, you have the ability to handle MIDI-files.
  3432. > When openening these Midi files with a QuickTime player (like MoviePlayer,
  3433. > PetersPlayer, etc.) you can convert the MIDI file to a Quicktime movie
  3434. > (Sound only, of course). 
  3435. > Even better is the ability (under the Options... button) to fiddle around
  3436. > with the instruments. 
  3437. > This means that the MIDI instruments (made by Roland, if you believe the
  3438. > About... button) are there, a samples, inside these extensions!
  3439.  
  3440. Yes, but you need the MoviePlayer version shipped with the 2.0b9 SDK CD.
  3441.  
  3442. > QUESTION: Is there a description of this: How is it formatted, how can I
  3443. > handle this from inside my programs?
  3444.  
  3445. This documentation will be released in the forthcoming SDK CD (2.0 final),
  3446. as for final dates, sorry I don't have the data.
  3447.  
  3448. Cheers, KEnt
  3449.  
  3450. -- 
  3451. Kent Sandvik    sandvik@apple.com            New Media Analyst/Programmer
  3452. Private activities on the net not sponsored by the company I work for.
  3453.  
  3454. +++++++++++++++++++++++++++
  3455.  
  3456. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  3457. Date: 17 Oct 94 16:06:59 +1300
  3458. Organization: University of Waikato, Hamilton, New Zealand
  3459.  
  3460. (sorry for the previous failures, our News system ran out of room...)
  3461.  
  3462. In article <sandvik-1610941318450001@17.255.38.231>, sandvik@apple.com (Kent San
  3463. dvik) writes:
  3464. > In article <b.kobben-111094164513@kartoserver.frw.ruu.nl>,
  3465. > b.kobben@frw.ruu.nl (Barend Kobben) wrote:
  3466. >
  3467. >> REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3468. >> Musical Instruments" extension, you have the ability to handle MIDI-files.
  3469. >> When openening these Midi files with a QuickTime player (like MoviePlayer,
  3470. >> PetersPlayer, etc.) you can convert the MIDI file to a Quicktime movie
  3471. >> (Sound only, of course).
  3472. >> Even better is the ability (under the Options... button) to fiddle around
  3473. >> with the instruments.
  3474. >> This means that the MIDI instruments (made by Roland, if you believe the
  3475. >> About... button) are there, a samples, inside these extensions!
  3476. >
  3477. > Yes, but you need the MoviePlayer version shipped with the 2.0b9 SDK CD.
  3478.  
  3479. No you don't! I was trying this out over the weekend, with MoviePlayer 1.0.
  3480. The MIDI files were off the CD-ROM that came with the July issue of "Future
  3481. Music" magazine. I copied them to my hard disk, set their type to "Midi", and
  3482. then did an "Open..." from within MoviePlayer. Sure enough, they showed up,
  3483. and I was able to convert them.
  3484.  
  3485. Just one problem: I had to click the "Options..." button before each file would
  3486. convert properly. If I didn't, I got a garbage movie. Just bringing up the
  3487. options dialog and clicking "Cancel" to go back to the save dialog was enough.
  3488.  
  3489. By the way, the options dialog is fun: you get to see all the instruments that
  3490. are installed, and there's a little keyboard so you can try them out!
  3491.  
  3492. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  3493. Computer Services Dept                     fax: +64-7-838-4066
  3494. University of Waikato            electric mail: ldo@waikato.ac.nz
  3495. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00
  3496.  
  3497. +++++++++++++++++++++++++++
  3498.  
  3499. >From jim _reekes@quickmail.apple.com (Jim Reekes)
  3500. Date: Mon, 17 Oct 1994 22:30:03 GMT
  3501. Organization: Apple Computer, Inc.
  3502.  
  3503. In article <1994Oct17.160700.34288@waikato.ac.nz>, ldo@waikato.ac.nz
  3504. (Lawrence D'Oliveiro, Waikato University) wrote:
  3505.  
  3506. > (sorry for the previous failures, our News system ran out of room...)
  3507. > In article <sandvik-1610941318450001@17.255.38.231>, sandvik@apple.com
  3508. (Kent San
  3509. > dvik) writes:
  3510. > > In article <b.kobben-111094164513@kartoserver.frw.ruu.nl>,
  3511. > > b.kobben@frw.ruu.nl (Barend Kobben) wrote:
  3512. > >
  3513. > >> REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3514. > >> Musical Instruments" extension, you have the ability to handle MIDI-files.
  3515. > >> When openening these Midi files with a QuickTime player (like MoviePlayer,
  3516. > >> PetersPlayer, etc.) you can convert the MIDI file to a Quicktime movie
  3517. > >> (Sound only, of course).
  3518. > >> Even better is the ability (under the Options... button) to fiddle around
  3519. > >> with the instruments.
  3520. > >> This means that the MIDI instruments (made by Roland, if you believe the
  3521. > >> About... button) are there, a samples, inside these extensions!
  3522. > >
  3523. > > Yes, but you need the MoviePlayer version shipped with the 2.0b9 SDK CD.
  3524. > No you don't! I was trying this out over the weekend, with MoviePlayer 1.0.
  3525. > The MIDI files were off the CD-ROM that came with the July issue of "Future
  3526. > Music" magazine. I copied them to my hard disk, set their type to "Midi", and
  3527. > then did an "Open..." from within MoviePlayer. Sure enough, they showed up,
  3528. > and I was able to convert them.
  3529. > Just one problem: I had to click the "Options..." button before each
  3530. file would
  3531. > convert properly. If I didn't, I got a garbage movie. Just bringing up the
  3532. > options dialog and clicking "Cancel" to go back to the save dialog was enough.
  3533. > By the way, the options dialog is fun: you get to see all the instruments that
  3534. > are installed, and there's a little keyboard so you can try them out!
  3535.  
  3536. The file type needs to be set to 'Midi' and then you import them. But
  3537. there's a bug and they may get imported as type TEXT. So you get a movie
  3538. with a TEXT track and not a Midi track. The workaround, as Lawrence has
  3539. found, is to first click the Options button. Then the Import will work.
  3540.  
  3541. You only need the new and un-tested version of MoviePlayer to change the
  3542. instruments *after* importing the Midi file to a movie.
  3543.  
  3544. - ---------------------------------------------------------------------
  3545. Jim Reekes, Polterzeitgeist   |     Macintosh Toolbox Engineering
  3546.                               |          Sound Manager Expert
  3547. Apple Computer, Inc.          | "All opinions expressed are mine, and do
  3548. 2 Infinite Loop  MS 302-3KS   |   not necessarily represent those of my
  3549. Cupertino, CA 95014           |       employer, Apple Computer Inc."
  3550.  
  3551. +++++++++++++++++++++++++++
  3552.  
  3553. >From 103t_english@west.cscwc.pima.edu
  3554. Date: 18 Oct 94 12:15:06 MST
  3555. Organization: (none)
  3556.  
  3557. In article <jim-1710941525530001@reekes1.apple.com>, jim _reekes@quickmail.apple.com (Jim Reekes) writes:
  3558. > In article <1994Oct17.160700.34288@waikato.ac.nz>, ldo@waikato.ac.nz
  3559. > (Lawrence D'Oliveiro, Waikato University) wrote:
  3560. >> (sorry for the previous failures, our News system ran out of room...)
  3561. >> 
  3562. >> In article <sandvik-1610941318450001@17.255.38.231>, sandvik@apple.com
  3563. > (Kent San
  3564. >> dvik) writes:
  3565. >> > In article <b.kobben-111094164513@kartoserver.frw.ruu.nl>,
  3566. >> > b.kobben@frw.ruu.nl (Barend Kobben) wrote:
  3567. >> >
  3568. >> >> REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3569. >> >> Musical Instruments" extension, you have the ability to handle MIDI-files.
  3570. >> >> When openening these Midi files with a QuickTime player (like MoviePlayer,
  3571.  
  3572. [mucho snipto]
  3573.  
  3574. >> 
  3575. >> Just one problem: I had to click the "Options..." button before each
  3576. > file would
  3577. >> convert properly. If I didn't, I got a garbage movie. Just bringing up the
  3578. >> options dialog and clicking "Cancel" to go back to the save dialog was enough.
  3579. >> 
  3580. >> By the way, the options dialog is fun: you get to see all the instruments that
  3581. >> are installed, and there's a little keyboard so you can try them out!
  3582. > The file type needs to be set to 'Midi' and then you import them. But
  3583. > there's a bug and they may get imported as type TEXT. So you get a movie
  3584. > with a TEXT track and not a Midi track. The workaround, as Lawrence has
  3585. > found, is to first click the Options button. Then the Import will work.
  3586. > You only need the new and un-tested version of MoviePlayer to change the
  3587. > instruments *after* importing the Midi file to a movie.
  3588.  
  3589.  
  3590. ON a related question: I know that QT 2.0 has MPEG capabilities also. WHile
  3591. I'm aware that there's no software-based decompressor, I noticed that when I
  3592. tried to open a .mpg file off of the SIGGRAPH CD, the latest Movie Player gave 
  3593. me the "CONVERT" button, just like when one converts a sound-track off of an 
  3594. audio CD.
  3595.  
  3596. Unfortunately, it wouldn't actually do anything, saying "this is not a movie."
  3597.  
  3598. Is this a feature that wasn't completely implemented, or am I not completing
  3599. the process correctly?
  3600.  
  3601.  
  3602. Thanks in advance.
  3603.  
  3604.  
  3605. Lawson
  3606.  
  3607. +++++++++++++++++++++++++++
  3608.  
  3609. >From paulcho@io.org (Paul C. H. Ho)
  3610. Date: Wed, 19 Oct 1994 14:42:33 -0500
  3611. Organization: Pink Elephant Technologies
  3612.  
  3613. In article <jim-1710941525530001@reekes1.apple.com>, jim
  3614. _reekes@quickmail.apple.com (Jim Reekes) wrote:
  3615.  
  3616. > In article <1994Oct17.160700.34288@waikato.ac.nz>, ldo@waikato.ac.nz
  3617. > (Lawrence D'Oliveiro, Waikato University) wrote:
  3618. > > (sorry for the previous failures, our News system ran out of room...)
  3619. > > 
  3620. > > In article <sandvik-1610941318450001@17.255.38.231>, sandvik@apple.com
  3621. > (Kent San
  3622. > > dvik) writes:
  3623. > > >
  3624. > > > Yes, but you need the MoviePlayer version shipped with the 2.0b9 SDK CD.
  3625. > > 
  3626. > > No you don't! I was trying this out over the weekend, with MoviePlayer 1.0.
  3627. > > The MIDI files were off the CD-ROM that came with the July issue of "Future
  3628. > > Music" magazine. I copied them to my hard disk, set their type to
  3629. "Midi", and
  3630. > > then did an "Open..." from within MoviePlayer. Sure enough, they showed up,
  3631. > > and I was able to convert them.
  3632. > > 
  3633. > > Just one problem: I had to click the "Options..." button before each
  3634. > file would
  3635. > > convert properly. If I didn't, I got a garbage movie. Just bringing up the
  3636. > > options dialog and clicking "Cancel" to go back to the save dialog was
  3637. enough.
  3638. > > 
  3639. > > By the way, the options dialog is fun: you get to see all the
  3640. instruments that
  3641. > > are installed, and there's a little keyboard so you can try them out!
  3642. > The file type needs to be set to 'Midi' and then you import them. But
  3643. > there's a bug and they may get imported as type TEXT. So you get a movie
  3644. > with a TEXT track and not a Midi track. The workaround, as Lawrence has
  3645. > found, is to first click the Options button. Then the Import will work.
  3646.  
  3647. I wrote a freeware program All Midi to do this in batch. Just drag and drop
  3648. (based on DropShell 2.0), no need to change file type or click the Options 
  3649. button. All Midi will automatically skip all non-midi file, so you can just
  3650. drop in a folder. I side step the bug by using Movie Data Exchange directly.
  3651.  
  3652. > You only need the new and un-tested version of MoviePlayer to change the
  3653. > instruments *after* importing the Midi file to a movie.
  3654.  
  3655. For the rest of us, download my shareware QuickMovie to change the
  3656. instruments after importing the Midi. It's in beta...
  3657.  
  3658. I wrote four QT midi programs with no document at all (except the header files
  3659. that come with CW4). Any comment or suggestion on my midi stuff are welcome.
  3660. ftp://sumex-aim.stanford.edu/info-mac/grf/util/desktop-tv-120.hqx
  3661. ftp://sumex-aim.stanford.edu/info-mac/grf/util/screen-movie-110.hqx
  3662. ftp://sumex-aim.stanford.edu/info-mac/grf/util/quick-movie-10b2.hqx
  3663. ftp://sumex-aim.stanford.edu/info-mac/snd/util/all-midi-10.hqx
  3664.  
  3665. DesktopTV and ScreenMovie can record MIDI sequence and connect
  3666. your MIDI keyboard to QT2.0 music instruments via MIDI manager.
  3667.  
  3668. BTW, where can I find QuickTimeLib for QT 2.0. I can't link quick-movie with
  3669. the PPC compiler.
  3670.  
  3671. > -----------------------------------------------------------------------
  3672. > Jim Reekes, Polterzeitgeist   |     Macintosh Toolbox Engineering
  3673. >                               |          Sound Manager Expert
  3674. > Apple Computer, Inc.          | "All opinions expressed are mine, and do
  3675. > 2 Infinite Loop  MS 302-3KS   |   not necessarily represent those of my
  3676. > Cupertino, CA 95014           |       employer, Apple Computer Inc."
  3677.  
  3678. Paul C.H. Ho
  3679. Pink Elephant Technologies
  3680. paulcho@io.org
  3681. Paul_C.H._Ho@magic.ca
  3682. 74020.772@compuserve.com
  3683.  
  3684.  
  3685. +++++++++++++++++++++++++++
  3686.  
  3687. >From paulcho@io.org (Paul C. H. Ho)
  3688. Date: Thu, 20 Oct 1994 09:03:13 -0500
  3689. Organization: Pink Elephant Technologies
  3690.  
  3691. In article <1994Oct18.121506@west.cscwc.pima.edu>,
  3692. 103t_english@west.cscwc.pima.edu wrote:
  3693.  
  3694. > In article <jim-1710941525530001@reekes1.apple.com>, jim
  3695. _reekes@quickmail.apple.com (Jim Reekes) writes:
  3696. > > In article <1994Oct17.160700.34288@waikato.ac.nz>, ldo@waikato.ac.nz
  3697. > > (Lawrence D'Oliveiro, Waikato University) wrote:
  3698. > > 
  3699. > >> (sorry for the previous failures, our News system ran out of room...)
  3700. > >> 
  3701. > >> In article <sandvik-1610941318450001@17.255.38.231>, sandvik@apple.com
  3702. > > (Kent San
  3703. > >> dvik) writes:
  3704. > >> > In article <b.kobben-111094164513@kartoserver.frw.ruu.nl>,
  3705. > >> > b.kobben@frw.ruu.nl (Barend Kobben) wrote:
  3706. > >> >
  3707. > >> >> REMARK: I recently was shown that if you have Quicktime 2.0 + "QuickTime
  3708. > >> >> Musical Instruments" extension, you have the ability to handle
  3709. MIDI-files.
  3710. > >> >> When openening these Midi files with a QuickTime player (like
  3711. MoviePlayer,
  3712. > [mucho snipto]
  3713. > >> 
  3714. > >> Just one problem: I had to click the "Options..." button before each
  3715. > > file would
  3716. > >> convert properly. If I didn't, I got a garbage movie. Just bringing up the
  3717. > >> options dialog and clicking "Cancel" to go back to the save dialog
  3718. was enough.
  3719. > >> 
  3720. > >> By the way, the options dialog is fun: you get to see all the
  3721. instruments that
  3722. > >> are installed, and there's a little keyboard so you can try them out!
  3723. > > 
  3724. > > The file type needs to be set to 'Midi' and then you import them. But
  3725. > > there's a bug and they may get imported as type TEXT. So you get a movie
  3726. > > with a TEXT track and not a Midi track. The workaround, as Lawrence has
  3727. > > found, is to first click the Options button. Then the Import will work.
  3728. > > 
  3729. > > You only need the new and un-tested version of MoviePlayer to change the
  3730. > > instruments *after* importing the Midi file to a movie.
  3731. > > 
  3732. > ON a related question: I know that QT 2.0 has MPEG capabilities also. WHile
  3733. > I'm aware that there's no software-based decompressor, I noticed that when I
  3734. > tried to open a .mpg file off of the SIGGRAPH CD, the latest Movie
  3735. Player gave 
  3736. > me the "CONVERT" button, just like when one converts a sound-track off of an 
  3737. > audio CD.
  3738. > Unfortunately, it wouldn't actually do anything, saying "this is not a movie."
  3739. > Is this a feature that wasn't completely implemented, or am I not completing
  3740. > the process correctly?
  3741.  
  3742. It seem QT 2.0 come with 2 MPEG import components and a MPEG media handler
  3743. but don't have any MPEG codec. That's why it try to import with the 'eat '
  3744. component
  3745. and then run into problem later...
  3746.  
  3747. > Thanks in advance.
  3748. > Lawson
  3749. Paul C. H. Ho
  3750. Pink Elephant Technologies
  3751. paulcho@io.org
  3752. Paul_C.H._Ho@magic.ca
  3753. 74020.772@compuserve.com
  3754.  
  3755.  
  3756. +++++++++++++++++++++++++++
  3757.  
  3758. >From sandvik@apple.com (Kent Sandvik)
  3759. Date: Sat, 22 Oct 1994 16:07:14 -0800
  3760. Organization: Apple Computer, Inc. Developer Technical Support
  3761.  
  3762. In article <1994Oct17.160700.34288@waikato.ac.nz>, ldo@waikato.ac.nz
  3763. (Lawrence D'Oliveiro, Waikato University) wrote:
  3764. > No you don't! I was trying this out over the weekend, with MoviePlayer 1.0.
  3765. > The MIDI files were off the CD-ROM that came with the July issue of "Future
  3766. > Music" magazine. I copied them to my hard disk, set their type to "Midi", and
  3767. > then did an "Open..." from within MoviePlayer. Sure enough, they showed up,
  3768. > and I was able to convert them.
  3769.  
  3770. Oh, the wonders of the Component Manager. I stand corrected.
  3771.  
  3772. --Kent
  3773.  
  3774. -- 
  3775. Kent Sandvik    sandvik@apple.com            New Media Analyst/Programmer
  3776. Private activities on the net not sponsored by the company I work for.
  3777.  
  3778. ---------------------------
  3779.  
  3780. >From emb121@hearst.cac.psu.edu (Eric Bennett)
  3781. Subject: Software volume locking: HELP!
  3782. Date: 18 Oct 1994 15:32:10 GMT
  3783. Organization: Penn State University
  3784.  
  3785. I have successfully used PBSetVInfo to software-lock a volume as
  3786. described in Inside Mac: Files on page 2-147, which deals with
  3787. PBSetVInfo (call PBGetVInfo, set bit 15 of the ioVAtrb field, and call
  3788. PBSetVInfo).  The only problem is that I cannot UNLOCK these volumes
  3789. using the same method (this time clearing bit 15)--I get the error
  3790. "volume locked" (error -43, I think). Yes, the volume is locked, but
  3791. shouldn't the command which can set the lock be able to unlock it? 
  3792. What toolbox call CAN I use to unlock a software-locked volume?
  3793.  
  3794. Thanks,
  3795. Ericb@psu.edu 
  3796.  
  3797. +++++++++++++++++++++++++++
  3798.  
  3799. >From psadri@sdcc13.ucsd.edu (Pasha Sadri)
  3800. Date: Tue, 18 Oct 1994 16:50:22 -0800
  3801. Organization: ucsd
  3802.  
  3803. In article <380ppq$nep@hearst.cac.psu.edu>, emb121@hearst.cac.psu.edu
  3804. (Eric Bennett) wrote:
  3805.  
  3806.  Yes, the volume is locked, but
  3807. > shouldn't the command which can set the lock be able to unlock it? 
  3808. > What toolbox call CAN I use to unlock a software-locked volume?
  3809.  
  3810. hi,
  3811.  
  3812. Apparantly not. I think you need to clear the bit manually using something
  3813. like Norton Disk Editor. I don't know how exactly but there was a post
  3814. sometime ago about how to do this. 
  3815.  
  3816. I know this isn't much help, but at least you won't try that again and
  3817. know what to look for. : )
  3818.  
  3819. Pasha Sadri
  3820. psadri@ucsd.edu
  3821.  
  3822. +++++++++++++++++++++++++++
  3823.  
  3824. >From emb121@hearst.cac.psu.edu (Eric Bennett)
  3825. Date: 19 Oct 1994 00:59:54 GMT
  3826. Organization: Penn State University
  3827.  
  3828. In article <psadri-1810941650220001@psadri.extern.ucsd.edu>
  3829. psadri@sdcc13.ucsd.edu (Pasha Sadri) writes:
  3830.  
  3831. > In article <380ppq$nep@hearst.cac.psu.edu>, emb121@hearst.cac.psu.edu
  3832. > (Eric Bennett) wrote:
  3833. >  Yes, the volume is locked, but
  3834. > > shouldn't the command which can set the lock be able to unlock it? 
  3835. > > What toolbox call CAN I use to unlock a software-locked volume?
  3836. > hi,
  3837. > Apparantly not. I think you need to clear the bit manually using something
  3838. > like Norton Disk Editor. I don't know how exactly but there was a post
  3839. > sometime ago about how to do this. 
  3840. > I know this isn't much help, but at least you won't try that again and
  3841. > know what to look for. : )
  3842.  
  3843. I know how to clear the bit with Norton Disk Editor--don't worry, I
  3844. haven't
  3845. done any damage to myself.  But clearing the bit with NDE seems like a
  3846. very non-Mac way of doing things.  I'm sure that there has to be a
  3847. toolbox
  3848. call that will do this--I just have no idea what it is (alternatively,
  3849. writing directly to the disk from within my program as NDE does ought
  3850. to
  3851. work, but I don't want to do that--I want to use a standard and SAFE
  3852. toolbox
  3853. call.
  3854.  
  3855. -Ericb@psu.edu
  3856.  
  3857.  
  3858.  
  3859. +++++++++++++++++++++++++++
  3860.  
  3861. >From lebra@cs.concordia.ca (LEBRA olivier)
  3862. Date: 19 Oct 1994 16:05:00 GMT
  3863. Organization: Dept. of Computer Science, Concordia University
  3864.  
  3865. In article <380ppq$nep@hearst.cac.psu.edu>, emb121@hearst.cac.psu.edu (Eric Bennett) writes:
  3866. |> I have successfully used PBSetVInfo to software-lock a volume as
  3867. |> described in Inside Mac: Files on page 2-147, which deals with
  3868. |> PBSetVInfo (call PBGetVInfo, set bit 15 of the ioVAtrb field, and call
  3869. |> PBSetVInfo).  The only problem is that I cannot UNLOCK these volumes
  3870. |> using the same method (this time clearing bit 15)--I get the error
  3871. |> "volume locked" (error -43, I think). Yes, the volume is locked, but
  3872. |> shouldn't the command which can set the lock be able to unlock it? 
  3873. |> What toolbox call CAN I use to unlock a software-locked volume?
  3874. |> 
  3875. |> Thanks,
  3876. |> Ericb@psu.edu 
  3877.  
  3878.  
  3879.  
  3880. I will help you !
  3881. I have made a soft called DiskLocker that made what you want.
  3882. Before unlocking the disk with PBSetVInfo, you must update a global variable
  3883. used by the Finder. I do not remember its name and its structure but I will
  3884. check at home and I will reply to you again soon.
  3885.  
  3886.  
  3887. olivier lebra      olebra@aedi.insa-lyon.fr  or lebra@cs.concordia.ca 
  3888.  
  3889. +++++++++++++++++++++++++++
  3890.  
  3891. >From sbryan@maroon.tc.umn.edu (Steve Bryan)
  3892. Date: Fri, 21 Oct 1994 06:24:29 GMT
  3893. Organization: Sexton Software
  3894.  
  3895. > In article <380ppq$nep@hearst.cac.psu.edu>, emb121@hearst.cac.psu.edu
  3896. > (Eric Bennett) wrote:
  3897. >  Yes, the volume is locked, but
  3898. > > shouldn't the command which can set the lock be able to unlock it? 
  3899. > > What toolbox call CAN I use to unlock a software-locked volume?
  3900.  
  3901. I don't know if you already have the response but the trick is to update
  3902. the vcb queue elem before making the unlock toolbox call. You can get the
  3903. vcb queue elem either by "walking the vcb queue" and setting the
  3904. appropriate bit in place (I think it is one of the bits in the attribute
  3905. field) or make a couple of calls to PBGetVInfo and PBSetVInfo. This
  3906. strategy worked for a little control panel I wrote many years ago (ie the
  3907. source code is not handy). Good luck.
  3908.  
  3909. -- 
  3910. Steve Bryan                  InterNet: sbryan@maroon.tc.umn.edu
  3911. Sexton Software            CompuServe: 76545,527
  3912. Minneapolis, MN                   Fax: (612) 929-1799
  3913.  
  3914. +++++++++++++++++++++++++++
  3915.  
  3916. >From lebra@cs.concordia.ca (LEBRA olivier)
  3917. Date: 21 Oct 1994 19:08:39 GMT
  3918. Organization: Dept. of Computer Science, Concordia University
  3919.  
  3920. In article <sbryan-2110940024290001@dialup-3-184.gw.umn.edu>, sbryan@maroon.tc.umn.edu (Steve Bryan) writes:
  3921. |> > In article <380ppq$nep@hearst.cac.psu.edu>, emb121@hearst.cac.psu.edu
  3922. |> > (Eric Bennett) wrote:
  3923. |> > 
  3924. |> >  Yes, the volume is locked, but
  3925. |> > > shouldn't the command which can set the lock be able to unlock it? 
  3926. |> > > What toolbox call CAN I use to unlock a software-locked volume?
  3927. |> > 
  3928. |> 
  3929. |> I don't know if you already have the response but the trick is to update
  3930. |> the vcb queue elem before making the unlock toolbox call. You can get the
  3931. |> vcb queue elem either by "walking the vcb queue" and setting the
  3932. |> appropriate bit in place (I think it is one of the bits in the attribute
  3933. |> field) or make a couple of calls to PBGetVInfo and PBSetVInfo. This
  3934. |> strategy worked for a little control panel I wrote many years ago (ie the
  3935. |> source code is not handy). Good luck.
  3936. |> 
  3937. |> -- 
  3938. |> Steve Bryan                  InterNet: sbryan@maroon.tc.umn.edu
  3939. |> Sexton Software            CompuServe: 76545,527
  3940. |> Minneapolis, MN                   Fax: (612) 929-1799
  3941.  
  3942.  
  3943. I think the simplest way to update the vcb queue is :
  3944. DefVCBPtr->vcbAtrb &= 0x7FFF;
  3945.  
  3946.  
  3947. -- 
  3948. *********************************************************************
  3949. *        olivier       * Until July 1996 : olebra@aedi.insa-lyon.fr *
  3950. *         lebra        * Until May 1995  : lebra@cs.concordia.ca    *
  3951. *********************************************************************
  3952. * 1950, Lincoln  App #1707  -  H3H 2N8  Montreal, Quebec  -  CANADA *
  3953. * Phone : (+1) 514-846 9781                                         *
  3954. *********************************************************************
  3955. *     "La simplicite est l'ultime forme de la sophistication."      *
  3956. *********************************************************************
  3957.  
  3958. +++++++++++++++++++++++++++
  3959.  
  3960. >From emb121@hearst.cac.psu.edu (Eric Bennett)
  3961. Date: 24 Oct 1994 16:18:11 GMT
  3962. Organization: Penn State University
  3963.  
  3964. In article <88387349253@jonathan.srcc.msu.su>
  3965. kluev@jonathan.srcc.msu.su (Kluev) writes:
  3966.  
  3967. > Try clear locked flag of vcbAtrb field of VCB describing volume.
  3968. > You can find VCB using GetVCBQHdr call and stepping via dLink
  3969. > field until you find the volume. This method, however, should
  3970. > be treated as modifying internal File Manager structures and
  3971. > should be avoided if possible.
  3972.  
  3973. I know--Inside Mac says DON'T PLAY WITH THE VCB--it is supposed to be
  3974. read only, not written to.  My question was, if I'm not supposed to
  3975. modify the VCB, how do I unlock the volume?  (Incidentally, when I
  3976. tried modifying the VCB, my machine locked up; however, since that's
  3977. the only suggestion I've gotten, I guess I'll try doing it again :).
  3978.  
  3979. -Ericb@psu.edu
  3980.  
  3981. ---------------------------
  3982.  
  3983. >From rang@winternet.com (Anton Rang)
  3984. Subject: Some string routines for the PowerPC
  3985. Date: 15 Oct 1994 21:29:50 GMT
  3986. Organization: Trillium Research, Inc.
  3987.  
  3988. Archive-name: ppc-string-utils.txt
  3989. Submitted-by: rang@winternet.com
  3990.  
  3991. This file implements some basic string routines for both C and Pascal
  3992. strings.  It's written in PowerPC assembly.  I did this mainly as a
  3993. learning experience; I was bored one day, and wanted to play with the
  3994. string instructions.
  3995.  
  3996. Routines implemented here are:
  3997.  
  3998.   strcpy and strcat -- both of these are about 30% faster than those
  3999.                provided by Apple or Metrowerks.
  4000.  
  4001.   pstrcpy and pstrcat -- very fast versions of the above for use with
  4002.              Pascal-style strings; much faster than those
  4003.              provided by Apple (PLstrcpy/PLstrcat).
  4004.  
  4005.   pstreq -- a fast equality test for Pascal-style strings.
  4006.  
  4007. If there's interest, I may develop and post more of these later.
  4008.  
  4009. I've appended a binhexed object library for those without an assembler.
  4010.  
  4011. An open question: Is there interest in developing a complete, or at
  4012. least subset, copyright-free, optimized, ANSI library for the PowerPC?
  4013. I see people complaining about Metrowerks' implementation, and neither
  4014. Metrowerks nor Apple has so far released a highly optimized library.
  4015. I'd rather see them concentrating on compiler technology, anyway.  If
  4016. there's enough interest, surely those of us on the net could compile a
  4017. reasonably complete library.  This would surely benefit all of the Mac
  4018. community.
  4019.  
  4020.   -- Anton
  4021.  
  4022. - -------- mylib.s
  4023. ;
  4024. ; Anton's library of handy string routines and such.
  4025. ;
  4026.  
  4027. ;
  4028. ; char *strcpy(char *, const char *)
  4029. ;
  4030. ; Copy a null-terminated string from one location to another; return the first location.
  4031. ; This goes really fast if you use the POWER 'lscbx' instruction.  *sigh*
  4032. ;
  4033.  
  4034.         export  my_strcpy[DS]
  4035.         export  .my_strcpy[PR]
  4036.         
  4037.         toc
  4038.             tc  my_strcpy[TC], my_strcpy[DS]
  4039.         
  4040.         csect   my_strcpy[DS]
  4041.             dc.l    .my_strcpy[PR]
  4042.             dc.l    TOC[tc0]
  4043.             dc.l    0
  4044.         
  4045.         csect   .my_strcpy[PR]
  4046.  
  4047.         ; First, move R3 into R5, so we have a copy we can change.  Bias it down by one byte.
  4048.         ; Bias R4 down too.
  4049.  
  4050.         subi    r5, r3, 1
  4051.         subi    r4, r4, 1
  4052.  
  4053.         ; Read a byte, store it, and compare it against zero.  Loop until we find the zero.
  4054.         ; By issuing the compare before the store, we save one cycle in branch resolution.
  4055.  
  4056. @0:     lbzu    r0, 1(r4)
  4057.         cmpwi   r0, 0
  4058.         stbu    r0, 1(r5)
  4059.         bne     @0
  4060.  
  4061.         ; All done.  Note that R3 has the return value already.
  4062.  
  4063.         blr
  4064.  
  4065. ;
  4066. ; void pstrcpy(unsigned char *, const unsigned char *)
  4067. ;
  4068. ; Copy a byte-counted string from one location to another.
  4069. ;
  4070.  
  4071.         export  pstrcpy[DS]
  4072.         export  .pstrcpy[PR]
  4073.         
  4074.         toc
  4075.             tc  pstrcpy[TC], pstrcpy[DS]
  4076.         
  4077.         csect   pstrcpy[DS]
  4078.             dc.l    .pstrcpy[PR]
  4079.             dc.l    TOC[tc0]
  4080.             dc.l    0
  4081.         
  4082.         csect   .pstrcpy[PR]
  4083.  
  4084.         ; Get the byte count, and add one to it to include the length byte.
  4085.  
  4086.         lbz     r5, 0(r4)
  4087.         addi    r5, r5, 1
  4088.  
  4089.         ; If the length is <= 32, we can complete the move in one pass.  We assume that this
  4090.         ; is the most common case, and hence set the branch-predict bit here.
  4091.         ; (Why 32 bytes?  We have 8 non-volatile scratch registers, R5..R12, to use.)
  4092.  
  4093. @0:     cmpwi   r5, 32
  4094.         ble+    @1
  4095.  
  4096.         ; OK...more than 32 bytes to move.  We'll move 28 bytes and then see if we can finish.
  4097.         ; (Why 28 bytes?  We're holding the length in R5, so we only have 7 scratch registers.)
  4098.  
  4099.         subi    r5, r5, 28
  4100.  
  4101.         lswi    r6, r4, 28
  4102.         addi    r4, r4, 28
  4103.  
  4104.         stswi   r6, r3, 28
  4105.         addi    r3, r3, 28
  4106.  
  4107.         b       @0
  4108.  
  4109.         ; We complete the move here, mov    b       @0
  4110.  
  4111.         ; We complete the move here, moving between 1 and 32 bytes.
  4112.  
  4113. @1:     mtxer   r5
  4114.  
  4115.         lswx    r5, r0, r4
  4116.         stswx   r5, r0, r3
  4117.  
  4118.         blr
  4119.  
  4120. ;
  4121. ; char *strcat(char *, const char *)
  4122. ;
  4123. ; Concatenate a null-terminated string onto another; return the address of the first string.
  4124. ;
  4125.  
  4126.         export  my_strcat[DS]
  4127.         export  .my_strcat[PR]
  4128.         
  4129.         toc
  4130.             tc  my_strcat[TC], my_strcat[DS]
  4131.         
  4132.         csect   my_strcat[DS]
  4133.             dc.l    .my_strcat[PR]
  4134.             dc.l    TOC[tc0]
  4135.             dc.l    0
  4136.         
  4137.         csect   .my_strcat[PR]
  4138.  
  4139.         ; First, move R3 into R5, so we have a copy we can change.  Bias it down by one byte.
  4140.         ; Bias R4 down too.
  4141.  
  4142.         subi    r5, r3, 1
  4143.         subi    r4, r4, 1
  4144.  
  4145.         ; Walk down the first string to its end.
  4146.  
  4147. @0:     lbzu    r0, 1(r5)
  4148.         cmpwi   r0, 0
  4149.         bne     @0
  4150.  
  4151.         ; R5 is now one byte past the end of the string.  Go backwards to bytes, so that
  4152.         ; it points just before the end of the string.
  4153.         
  4154.         subi    r5, r5, 2
  4155.  
  4156.         ; Read a byte, store it, and compare it against zero.  Loop until we find the zero.
  4157.         ; By issuing the compare before the store, we save one cycle in branch resolution.
  4158.  
  4159. @1:     lbzu    r0, 1(r4)
  4160.         cmpwi   r0, 0
  4161.         stbu    r0, 1(r5)
  4162.         bne     @1
  4163.  
  4164.         ; All done.  Note that R3 has the return value already.
  4165.  
  4166.         blr
  4167.  
  4168. ;
  4169. ; void pstrcat(unsigned char *, const unsigned char *)
  4170. ;
  4171. ; Concatenate a byte-counted string onto another.  This doesn't do any error checking.
  4172. ;
  4173.  
  4174.         export  pstrcat[DS]
  4175.         export  .pstrcat[PR]
  4176.  
  4177.         toc
  4178.             tc  pstrcat[TC], pstrcat[DS]
  4179.  
  4180.         csect   pstrcat[DS]
  4181.             dc.l    .pstrcat[PR]
  4182.             dc.l    TOC[tc0]
  4183.             dc.l    0
  4184.  
  4185.         csect   .pstrcat[PR]
  4186.  
  4187.         ; Get the byte count of both strings.
  4188.  
  4189.         lbz     r6, 0(r3)
  4190.         lbz     r5, 0(r4)
  4191.  
  4192.         ; Note that lswx/stswx are defined to do nothing if the length (in XER) is zero.
  4193.         ; If they weren't, we would want the following two lines, to check that the
  4194.         ; concatenation is actually doing something.
  4195.  
  4196.         ; cmpwi r5, 0
  4197.         ; beqlr
  4198.  
  4199.         ; Add them together to get the new length; store it.
  4200.  
  4201.         add     r7, r6, r5
  4202.         stb     r7, 0(r3)
  4203.  
  4204.         ; Move destination address past old data (length + 1 bytes).
  4205.         ; Move source address past its length too (1 byte).
  4206.         
  4207.         addi    r3, r3, 1
  4208.         addi    r4, r4, 1
  4209.         add     r3, r3, r6
  4210.  
  4211.         ; If the length is <= 32, we can complete the move in one pass.  We assume that this
  4212.         ; is the most common case, and hence set the branch-predict bit here.
  4213.         ; (Why 32 bytes?  We have 8 non-volatile scratch registers, R5..R12, to use.)
  4214.  
  4215. @0:     cmpwi   r5, 32
  4216.         ble+    @1
  4217.  
  4218.         ; OK...more than 32 bytes to move.  We'll move 28 bytes and then see if we can finish.
  4219.         ; (Why 28 bytes?  We're holding the length in R5, so we only have 7 scratch registers.)
  4220.  
  4221.         subi    r5, r5, 28
  4222.  
  4223.         lswi    r6, r4, 28
  4224.         addi    r4, r4, 28
  4225.  
  4226.         stswi   r6, r3, 28
  4227.         addi    r3, r3, 28
  4228.  
  4229.         b       @0
  4230.  
  4231.         ; We complete the move here, moving between 1 and 32 bytes.
  4232.  
  4233. @1:     mtxer   r5
  4234.  
  4235.         lswx    r5, r0, r4
  4236.         stswx   r5, r0, r3
  4237.  
  4238.         blr
  4239.  
  4240. ;
  4241. ; void pstrcatchr(unsigned char *dest, unsigned char src)
  4242. ;
  4243. ; Concatenate a single character onto a byte-counted string.
  4244. ;
  4245.  
  4246.         export  pstrcatchr[DS]
  4247.         export  .pstrcatchr[PR]
  4248.  
  4249.         toc
  4250.             tc  pstrcatchr[TC], pstrcatchr[DS]
  4251.  
  4252.         csect   pstrcatchr[DS]
  4253.             dc.l    .pstrcatchr[PR]
  4254.             dc.l    TOC[tc0]
  4255.             dc.l    0
  4256.  
  4257.         csect   .pstrcatchr[PR]
  4258.  
  4259.         ; Get the byte count of the string; add one to it and store it back.
  4260.  
  4261.         lbz     r5, 0(r3)
  4262.         addi    r5, r5, 1
  4263.         stb     r5, 0(r3)
  4264.         
  4265.         ; Store the character we want to concatenate at the end of the string, and return.
  4266.  
  4267.         stbx    r4, r3, r5
  4268.         blr
  4269.  
  4270. ;
  4271. ; Boolean pstreq(unsigned char *s1, unsigned char *s2)
  4272. ;
  4273. ; Compare two byte-counted strings for equality; return true (1) if they're equal.
  4274. ;
  4275.  
  4276.         export  pstreq[DS]
  4277.         export  .pstreq[PR]
  4278.  
  4279.         toc
  4280.             tc  pstreq[TC], pstreq[DS]
  4281.  
  4282.         csect   pstreq[DS]
  4283.             dc.l    .pstreq[PR]
  4284.             dc.l    TOC[tc0]
  4285.             dc.l    0
  4286.  
  4287.         csect   .pstreq[PR]
  4288.  
  4289.         ; First, get the byte count of both strings.
  4290.  
  4291.         lbz     r5, 0(r3)
  4292.         lbz     r6, 0(r4)
  4293.  
  4294.         ; If the byte counts aren't equal, fail immediately.
  4295.  
  4296.         cmpw    r5, r6
  4297.         bne     @fail
  4298.  
  4299.         ; OK, we have two strings of matching length.  Increment the addresses to point to
  4300.         ; the actual text of the strings.
  4301.         
  4302.         addi    r3, r3, 1
  4303.         addi    r4, r4, 1
  4304.  
  4305.         ; If the length is <= 16, we can complete the comparison in one pass.  We assume
  4306.         ; that this is the most common case, and hence set the branch-predict bit here.
  4307.         ; (Why 16 bytes?  We have 8 non-volatile scratch registers, R5..R12, to use.)
  4308.  
  4309. @0:     cmpwi   r5, 16
  4310.         ble+    @1
  4311.  
  4312.         ; OK...more than 16 bytes to compare.  We'll compare 12 bytes and then see if we can
  4313.         ; finish.  (Why 12 bytes?  The length is in R5, so we only have 7 scratch registers,
  4314.         ; and we can only use whole registers for the string-load instructions.)
  4315.  
  4316.         lswi    r6, r3, 12
  4317.         lswi    r9, r4, 12
  4318.  
  4319.         addi    r3, r3, 12
  4320.         addi    r4, r4, 12
  4321.         subi    r5, r5, 12
  4322.  
  4323.         ; Compare each of the register pairs R6/R9, R7/R10, R8/R11.  If any differs, exit.
  4324.  
  4325.         cmp     0, 0, r6, r9
  4326.         cmp     1, 0, r7, r10
  4327.         cmp     2, 0, r8, r11
  4328.  
  4329.         bne     0, @fail
  4330.         bne     1, @fail
  4331.         bne     2, @fail
  4332.  
  4333.         b       @0
  4334.  
  4335.         ; We complete the comparison here, comparing between 1 and 16 bytes.
  4336.         ; If R5 is zero, we succeed immediately.
  4337.  
  4338. @1:     cmpwi   r5, 0
  4339.         beq     @succ
  4340.  
  4341.         ; Load the strings into R5..R8 and R9..R12.  Save R5 first.
  4342.  
  4343.         mr      r0, r5
  4344.         mtxer   r5
  4345.  
  4346.         lswx    r5, r0, r3
  4347.         lswx    r9, r0, r4
  4348.  
  4349.         ; Compare R5 against R9; if they differ, fail.
  4350.         ; If they're the same, and R0 is <= 4, succeed.
  4351.  
  4352.         cmp     0, 0, r5, r9
  4353.         cmpi    1, 0, r0, 4
  4354.         
  4355.         bne     0, @fail
  4356.         ble     1, @succ
  4357.  
  4358.         ; Compare R6 against R10; fail if different.  Succeed if R0 <= 8.
  4359.  
  4360.         cmp     0, 0, r6, r10
  4361.         cmpi    1, 0, r0, 8
  4362.         
  4363.         bne     0, @fail
  4364.         ble     1, @succ
  4365.  
  4366.         ; Compare R7 against R11; fail if different.  Succeed if R0 <= 12.
  4367.  
  4368.         cmp     0, 0, r7, r11
  4369.         cmpi    1, 0, r0, 12
  4370.         
  4371.         bne     0, @fail
  4372.         ble     1, @succ
  4373.  
  4374.         ; compare R8 against R12; fail if different, succeed if same.
  4375.  
  4376.         cmpw    r7, r11
  4377.         bne     @fail
  4378.  
  4379.         ; Success!
  4380.  
  4381. @succ:  li      r3, 1
  4382.         blr
  4383.  
  4384.         ; Failure
  4385.  
  4386. @fail:  li      r3, 0
  4387.         blr
  4388.  
  4389. - ----- mylib.s.o.hqx
  4390.  
  4391. (This file must be converted with BinHex 4.0)
  4392. :#@ejE'PL,R-ZE`"B3dp'69"6)!#3"!CJ!*!%-AJ"h`!#UX9iiJ!!!`J!N!-T!*!
  4393. %,R4PH(3!N!d"N!!!N!0N!*!2)#jNBA4K!*!&!C!!!!!"N!!!N!0J!!!"p!!!!P3
  4394. !N!85!*!&3$LMrrmiK2rrM!3!!5`!N!1F"3!"3),rp%k!!##)T!!!1+8!!5`&!#"
  4395. !S3!F1+Arj(c%j+SiK!!FI-2PUMKM!"a,rrrNI+%$TRbJ*#TmS"dU6S!!)$LMrrm
  4396. iK2rrM!8!!5`!N!0!J[ri1+ArrS`%!!%X!*!$R!8!!8##rr41J!!JL--!!)LN!!"
  4397. mjLS8Q1-!!$KM!!%iK!!"I'-b&#`&!#"!S3!F1+Arj(c%j+SiK!!FI-2PUMKM!"a
  4398. ,rrrNI+%$TRbJ*#TmS"dU6S!!))LM!!!iT3!"Q+-!!(b$+Dj1J!!JL+-!!)M%!!"
  4399. m"6!!3))!R$KM!!%iK!!",!8!%%#K!$4m`f5UI54NUMKM!!`iK!!-1+Arp(`'5!"
  4400. mKe!!I3KB!%##!'K!KJ"N3)S!B%[rrm`X"3!!3B)!6(bJ+hKmS31QI+!F+RdJ*#T
  4401. m"8J!,)!!"%##!$K!K3!XI!C3!#b!!!K!JJ!S3)8!((`(@!!XJ!!-3))!'%#&!!a
  4402. m"eJ!3))!$$KJ!!&1J!!J1'!!!%k!!#!!N!B"f!#3"a`!!!(B!*!(9!!!!GJ!N!H
  4403. !!!!"f!#3"m`!!!(B!*!(i!!!!GJ!N!B"N!!!!!'F!!!"U!!!!E3!!!(!!!!"c!!
  4404. !!C!!!*!$#4m!N!-"P!#3!`-I!*!$!C`!N!-2(`#3!`'J!*!$!am!N!-"U!#3!a8
  4405. I!*!$!D`!N!-$(`#3!`'d!*!$'am!N!-"Z!#3!`-I!*!$!F!!N!-K(`#3!`(%!*!
  4406. $!am!N!-"c!#3!bFI!*!$!G!!N!-$(`#3!`(B!*!$"am!N!-"h!#3!`dI!*!$!H!
  4407. !N!-6(`#3!`(N!*!$'4m!N!-"k!#3!amI!*!$!H`!N!-P(`"YH@aTBLjc!*!&rri
  4408. -!@F!N!i"!!"V!3#3#K%!N!G86d-!N!F"f!!#!!"V!3#3#K%2!*!0"!!!!GJ!!J!
  4409. !D`%!N!-%!*!'%3-!N!d1!!!"N!!!!J!!!J%!N!--!*!'%3S!N!dB!*!&!3!!!J%
  4410. !N!-F!*!'%3#3"h"cG(*MF(N!N!-"h!!#!!"V!3#3!`3!N!B4!`#3"R"cG(*MF(N
  4411. !N!-"R!!#!!!#!3#3!``!N!B4#J#3$5-!N!-F!!%!!!)"!*!$1!#3"K%!N!iX!!!
  4412. "i!!#!!"V!3#3!`3!N!B4!`#3$6B!!!'S!!)!!!)"!*!$$!#3"K%+!*!03!#3!e3
  4413. !!3!!!J%!N!-X!*!'%3#3"h"cG(*MBA3!N!-"j!!#!!"V!3#3!`3!N!B4!`#3"R"
  4414. cG(*MBA3!N!-"Y!!#!!!#!3#3!``!N!B4#J#3$8X!N!1!!!%!!!)"!*!$6!#3"K%
  4415. !N!j8!!!"k!!#!!"V!3#3!`3!N!B4!`#3$9m!!!(!!!)!!!)"!*!$$!#3"K%+!*!
  4416. 0DJ#3!m`!!3!!!J%!N!-8!*!'%3#3"h"cG(*PF3#3"!(X!!)!!'X"!*!$"!#3"K%
  4417. $!*!'F(0dFQ9a!*!%!F`!!J!!!J%!N!--!*!'%3S!N!BZF(0dFQ9a!*!%i!!"!!!
  4418. #!3#3!l!!N!B4!*!+GQejAh0dFQ0`H3"YH9pcG(*MF(N!,QejAh0dFQ0`H3!ZF(0
  4419. dFQ0`H3"YH9pcG(*MBA3!EAPIFh4bBf&d!#jYH9pcG(*MBA3!,R"cG(*MBA3!F(0
  4420. dFQ0KG'0SFJ"`Fh4bBf&dBfKb!#j`Fh4bBf&dBfKb!1RK!!!:
  4421. --
  4422. Anton Rang (rang@winternet.com)
  4423.  
  4424. ---------------------------
  4425.  
  4426. >From blob@apple.com (Brian Bechtel)
  4427. Subject: Tech Notes on the World Wide Web, and History Is Made
  4428. Date: 19 Oct 1994 16:49:23 -0700
  4429. Organization: Apple Computer, Inc., Cupertino, California
  4430.  
  4431. New excitement on the digital traffic jam.  
  4432.  
  4433. Apple has now put all the tech notes (including the four new technotes
  4434. from the November developer CD which is _just_ going into the mail to
  4435. our developers right now as I type) on the Web.  Use Mosaic. Use MacWeb.
  4436. Use NetScape.  Explore.
  4437.  
  4438.  http://www.info.apple.com/dev/technotes/Main.html
  4439.  
  4440. The new tech notes include Jim Luther's "FL 37 Permission to do
  4441. What?!!?" (file permissions), Nitin Ganatra's "PS 02 Background-Only
  4442. Applications" (a revision of how to write faceless background
  4443. applications), Brian Bechtel's "OS 06 Control Strip Modules" (docs for
  4444. writing Control Strip modules, revised and corrected), and...
  4445.  
  4446.   Errata for Inside Macintosh:Networking
  4447.  
  4448. Yeah. That's right.  Rich Kubota and Scott Kuechle put together an
  4449. actual list of known errors in Inside Macintosh:Networking.  We have more
  4450. errata sheets under review, too.  When they get reviewed, we'll put them
  4451. up there as well.
  4452.  
  4453. For some help on getting started programming the Mac (and a desperate
  4454. plea for some feedback on said help), look at
  4455.  
  4456.  http://www.info.apple.com/dev/default.html
  4457.  
  4458. If you find this stuff useful, please let us know.  Thanks to Michelle
  4459. Wyner, ex-intern, and Mark Cookson for doing all the real work.
  4460.  
  4461. --Brian Bechtel     blob@apple.com     "My opinion, not Apple's"
  4462.  
  4463. If you don't know all these buzzwords, go read a different newsgroup
  4464. until you do.  Don't ask me; hell, I made up half of them myself.
  4465.  
  4466. ---------------------------
  4467.  
  4468. End of C.S.M.P. Digest
  4469. **********************
  4470.  
  4471.  
  4472.  
  4473.